Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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 見てみましょう。

BSD-grep
# 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.
GNU-grep
# grep (GNU grep) 2.14

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

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

dtan4
SRE @ Microservices Platform Team
http://dtan4.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away