はじめに

grepしてファイルから条件に合致する行を抜き出したいが、はじめから数行だけでいい場合や、うしろから数行だけでいい場合、安易にgrepheadもしくはtailを組み合わせてはいけない。

headの代わり

例えば、次のようなコマンドを書いた場合、sample.txt全部をgrepで処理してから、結果の最初の1行を返すことになるので、sample.txtが大きなファイルだと時間がかかる。

grep sample_cond sample.txt | head -1

grepには-m NUM, --max-count=NUMオプションがあり、マッチした行数が NUM に達したら、ファイルの読み込みを中止することができる。適切なコマンドは以下になる。

grep -m 1 sample_cond sample.txt

tailの代わり

うしろから数行だけを取得する場合は、少しテクニックが必要になる。tacコマンドというcatを逆さにしたコマンドが、ファイルのうしろから順に標準出力に出力してくれるため、tacgrep -mをパイプで組み合わせる。

grep sample_cond sample.txt | tail -1

このコマンドを適切なものに書き換える。

tac sample.txt | grep -m 1 sample_cond

出力する行数が今の例では1行なので特に気になる点はないが、複数行出力するとうしろから順番に出力されてしまう。出力順は通常通りにしたければ、最後にもう一度tacを実行すれば出力順が再度逆転して通常になる。

tac sample.txt | grep -m 5 sample_cond | tac