grep の出力をバッファさせない

Posted on
qiita ShellScript grep

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

grep コマンドは、何もしないと出力をバッファする(一旦溜め込む)ようになっています。

あるファイル全体とか固定のデータに対して grep する場合は特に気にならないでしょう。 しかしストリーミングデータを扱う場合、例えば何らかのログファイルを tail -f したものに対して grep すると、複数行がまとめて遅延して出力されてしまいます。 ここは元のログが出力されると(ほぼ)同時に、リアルタイムに grep 結果も出力してほしいところです。

解決策: --line-buffered オプション

grep に --line-buffered オプションをつけると、出力がバッファされることなくリアルタイムに表示されるようになります!

$ tail -f /var/log/access.log | grep -E '\.png$' --line-buffered

--line-buffered は、「1行単位で出力させる」というオプションです。BSD grep と GNU grep ともに用意されているので、Mac ユーザも Linux ユーザも安心です。

man 見てみましょう。

# grep (BSD grep) 2.5.1-FreeBSD

--line-buffered
    Force output to be line buffered.  By default, output is line buffered when standard output is a terminal and block buffered otherwise.
# grep (GNU grep) 2.14

--line-buffered
    Use line buffering on output.  This can cause a performance penalty.

パフォーマンスが悪くなるかも、と書いてあります。状況によって使い分けましょう。