覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

tail -f した内容をgrepしてリアルタイムで出力する

Linuxでログファイルの状態をリアルタイムで確認する場合 tailコマンドに -f オプションをつけて tail -f {ログファイル名} という使い方をすることが多々あります。

例えば、今まさにログが追記されている application.log というログファイルの内容を
リアルタイムで確認するには以下のように実行します。

tail -f application.log


そして、こういう時には往々にして、出力される内容を特定の文字列が含むものだけに絞り込みたい場合があります。
例えば ERROR というキーワードが付いた行だけ出力したい。となった場合は以下のようにパイプで繋いで grep するようにします。

tail -f application.log | grep "ERROR"

こうすると ERROR という文字列が含まれる行だけ出力されるようになります。


さらに絞りこんだ内容に test-user が含まれる行は除外したい となった場合は、さらにパイプで繋いで以下のようにします。

tail -f application.log | grep "ERROR" | grep -v "user-test"

しかし、こうすると結果がリアルタイムで出力されません。
これは、grep がバッファリングしているためで、バッファが一定量になるまで出力されません。

こういう時は、grep に --line-buffered のオプションを付ける事でバッファリングしなくなり、リアルタイムで出力されるよになります。


先ほどの例は以下のように書き換えできます。

tail -f application.log | grep --line-buffered "ERROR" | grep --line-buffered -v "user-test"

これでgrepを重ねても、リアルタイムで出力されるようになります。


(ただし、--line-buffered を使うとパフォーマンスが若干悪くなる場合があるようです。一応意識はしておいた方がいいかもしれません)