Dtail - 最終nレコードの抜出し

形式

Dtail [ -number-of-records ] [input-file..]

DtaDtailの短縮形(UNIXのみ)。

説明

Dtail は、各 input-file の最終 number-of-records レコードを選択する。 入力ファイルに -number-of-records レコードなかった場合は、 そのファイルのすべてのレコードが選択される。 (次の入力ファイルに食込むことはない)。

input-filesが複数ある場合、 フィールド"filename:" が各出力レコードに付加される。 ただし、入力ファイルが標準入力のときは、付加されない。

number-of-records の指定がない場合、1が仮定される。

既定フィールド名

filename:
入力ファイルが複数の場合、各レコードの先頭。

使用例

各".d"ファイルから最後のレコードを選択する。

Dtail *.d

"foo.d"ファイルから最後5レコードを選択する。

Dtail -5 list.d

"bar.d"ファイルの最後から10番目のレコードを選択する。

Dtail -10 bar.d | Dhead

動作について

末尾のレコードを取り出すのは、見かけほど単純な仕事ではない。 実際、GNUの"head"コマンドのソースは500行もないのに、 "tail"コマンドのソースは1500行ほどもある。

難しさの最大の理由は、当然であるがファイルを後ろ向きに読むという 機能がないためである。 ディスクであれば、ファイルの全体サイズを知っていれば、 ある場所に跳ぶことによって 最終ブロックから読むことはできる。 しかし、ファイルが端末の場合これはできない。

さらに、"tail"コマンドは、"follow"モードをサポートしている。 これは、ファイルが書き込まれているとき、 継続して最終行を追跡出力する機能である。 たとえば、書き込み最中のログファイルの最終行を 得るために有用である。

しかし、Dtailは"follow"モードをサポートしない。 また、number-of-records以外のその他のオプションもサポートしない。 Dtailは、他のDコマンド同様、きわめてシンプルな機能のみもつ。 しかし、それでも逆読みができないという難しさを克服する必要はある。

Dtailのこの問題の解決方法は、また単純で一般的であるが、 時としてかなり実行速度の遅くなる方法である。 最初からレコードを読んで、 常に最終number-of-recordsレコードを先入れ先出しキューに保持する。 ファイルの終りに達したとき、キューに残っているレコードを書き出す。

このアルゴリズムは、標準入力を含むすべてのファイルに適用でき、 そのためかなりの程度ソースプログラムを縮小できるという点、 単純で一般的である。 一方で、この方法はプログラムをかなり遅くする。 たとえ最終1レコードのためだけでも全レコードを読み込まねばならないためである。 さらに、大量のメモリーを必要とする方法でもある。 常にnumber-of-recordsレコードをメモリーに保持しなければならないし、 またたとえ一時的でも、 最大長のレコードを必ず読み込まなければならないためである。

Dレコードを後ろから読む方法は、ディスクファイルに対しては可能であるし、 実行速度を向上させることも確実である。 将来のバージョンでは考慮されるべき改良点であろう。

メッセージ

マニュアル D_msg参照。

参照

DintroDheadDextractD_msg

AUTHOR

MIYAZAWA Akira


miyazawa@nii.ac.jp
2003