`tail -f`のリアルタイム出力にフィルターを適用する方法は?


60
tail -f path

上記はファイルの変更を即座に出力しますが、出力にフィルターを適用したいので、キーワードが含まxxxれている場合にのみ表示します。

これにアプローチする方法は?


1
回答を承認済みとしてマークすると、あなたの質問と回答を読んでいる他の人が、同様の質問や問題がある場合にどの回答が役立つ可能性が高いかを知るのに役立ちます。ユーザー名をクリックして、以前の質問に再度アクセスできます。
デニスウィリアムソン

回答:


84

Unixでは、あるプログラムの出力を別のプログラムにパイプすることができます。

したがって、tailをフィルタリングするには、grepを使用できます。

tail -f path | grep your-search-filter

しかし、末尾(ファイルの最後)に100行あるとします。これらの行はフィルターしたい行です。あなたのソリューション
TraderJoeChicago

1
ファイルの最後の100行のみを検索する場合は、tail -100 path | grep xxx
AddersUK

15

簡潔な答え: tail -f somefile | grep somepattern

ただし、これは不足する傾向があります。頻繁にローテーションされるファイルをテーリングしているとしましょう(デバッグログの場合、複数回ローテーションされる可能性があります)。その場合tail -F、あなたの友人です。違いを調べてみましょう。

しかしtail -ftail -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ツールチェーンによって提供されたものだと思います(使用したことはありません)。

これがあなたのお役に立てば幸いです。

乾杯、キャメロン


これがラインバッファモードで機能する理由についての説明を本当に感謝しています。それは素晴らしい洞察です、ありがとう。
グリーン

2

また、複数のパイプとgrepsを使用し、grep -vで除外したり、grep -iで大文字と小文字を区別しないようにしたりできます。

例:tail -100f / var / log / messages | grep -V ACPI | grep -i ata

末尾から100行のテーリングを開始し、テーリングを維持します。最初にACPIの行を除外し、次にata、ATA、またはそれらの任意の組み合わせの行を表示します。

もう1つの便利な方法は、After、Before、およびContextの行(前後の行)のABCオプションです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.