解決策 1:
Unix では、あるプログラムの出力を別のプログラムにパイプできます。
したがって、末尾をフィルタリングするには、grep を使用できます:
tail -f path | grep your-search-filter
解決策 2:
短い答え: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
の stdout であるため、一度に 1 ページになります。 完全にバッファリングされた方法で動作しているため、awk
一度に 4kB の入力を受け取ります (デフォルト)。
この場合、grep
と言えます --line-buffered
を使用して常に stdout 行をバッファリングする オプション。
tail -F -n0 somefile | grep --line-buffered somepattern | ...
ただし、ほとんどのコマンドには --line-buffered
のようなものはありません .よりスクリプト可能なツールの場合、関数を使用して出力をフラッシュできます (例:awk
) 、関数は fflush()
です 、C の対応するものと同じ名前を共有しますが、Perl や Python などのツールには似たようなものがあります)。
cut
などと あなたはおそらく運が悪いです。 ... unbuffer
を検索してみてください。 、これは expect
によって提供されるものだと思います ツールチェーン (使ったことがない)
これがお役に立てば幸いです。
乾杯、キャメロン
解決策 3:
また、複数のパイプと grep を使用して、grep -v で対象を除外したり、grep -i で大文字と小文字を区別しないようにしたりできます。
例:tail -100f /var/log/messages | grep -V ACPI | grep -i ata
最後から 100 行のテーリングを開始し、テーリングを続けます。最初に ACPI を含む行を除外してから、ata、ATA、またはそれらの混合を含む行を表示します。
もう 1 つの便利なオプションは、ABC オプションで、After、Before、および Context (前後の行) の行です。