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

[ 英語 | 日本語 ]

[Dホームページへ]

形式

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

説明

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

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

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

オプション

-D [i/o]datautf=8|16|32
UTF入出力機能参照。

既定フィールド名

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

環境変数

Ddatautf, Didatautf, Dodatautf
UTF入出力機能参照。

使用例

各".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