[ 英語 | 日本語 ]
Dtail [ -number-of-records ] [ input-file.. ]
Dta は Dtailの短縮形(UNIXのみ)。
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参照。
Dintro、 Dhead、 Dextract、 D_msg。
MIYAZAWA Akira