回答:
Unixでは、あるプログラムの出力を別のプログラムにパイプすることができます。
したがって、tailをフィルタリングするには、grepを使用できます。
tail -f path | grep your-search-filter
簡潔な答え: tail -f somefile | grep somepattern
ただし、これは不足する傾向があります。頻繁にローテーションされるファイルをテーリングしているとしましょう(デバッグログの場合、複数回ローテーションされる可能性があります)。その場合tail -F
、あなたの友人です。違いを調べてみましょう。
しかしtail -f
、tail -F
最初に大量の行を出力します。これは、このユースケースでは望ましくないことが多いため、この場合は、-n0
tail -F -n0 somefile | grep somepattern
他のフィルタリングを実行するまでは問題ありません。その後、バッファリングに注意する必要があります。stdoutは、端末への書き込み時にはデフォルトで行バッファリングされますが、パイプへの書き込み時には完全にバッファリングされます。したがって、次のコードtail
は、明示的に行バッファリングされているため(または各行の最後で出力をフラッシュします)、grep
出力が端末に送られるため、行バッファリングされているため、見つかった行をすぐに出力します:
tail -F -n0 somefile | grep somepattern
しかし、その後、あなたのようなものを使用することを決定しawk
たりcut
、さらに出力を処理します。
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
そして今、あなたは出力がどこに行ったのか不思議に思います...ログの量に応じて、あなたは出力を得ることを見つけるかもしれませんが、標準出力はgrep
完全にバッファされた方法で動作しているので、一度にページになります、そのためawk
、一度に4kBの入力を受け取ります(デフォルト)。
この場合、オプションgrep
を使用して、常にstdout行をバッファーに入れるように指示でき--line-buffered
ます。
tail -F -n0 somefile | grep --line-buffered somepattern | ...
ただし、ほとんどのコマンドにはの類似物がありません--line-buffered
。よりスクリプト化可能なツールの場合、関数を使用して出力をフラッシュできます(たとえばawk
、関数はfflush()
、対応するCのツールと同じ名前を共有します。PerlやPythonなどのツールは類似しています)。
cut
あなたのようなものでは、おそらく運が悪いでしょう。...しかしunbuffer
、を検索してみてください。これは、expect
ツールチェーンによって提供されたものだと思います(使用したことはありません)。
これがあなたのお役に立てば幸いです。
乾杯、キャメロン