Dtail [ -number-of-records ] [ input-file.. ]
Dtail は,各 input-file の最終 number-of-records レコードを選択する。 入力ファイルに -number-of-records レコードなかった場合は, そのファイルのすべてのレコードが選択される。 (次の入力ファイルに食込むことはない)。
input-filesが複数ある場合, フィールド"filename:" が各出力レコードに付加される。 ただし,入力ファイルが標準入力のときは,付加されない。
number-of-records の指定がない場合,1が仮定される。
各".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参照。
MIYAZAWA Akira