はじめに
grep
してファイルから条件に合致する行を抜き出したいが、はじめから数行だけでいい場合や、うしろから数行だけでいい場合、安易にgrep
とhead
もしくは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
を逆さにしたコマンドが、ファイルのうしろから順に標準出力に出力してくれるため、tac
とgrep -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