GNU/Linux >> Linux の 問題 >  >> Linux

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

解決策 1:

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

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

tail -f path | grep your-search-filter

解決策 2:

短い答え: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 の 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 (前後の行) の行です。


Linux
  1. 再帰的にgrepするにはどうすればよいですか?

  2. ffmpeg出力から継続時間を抽出するには?

  3. トップコマンドの出力をLinuxのファイルにキャプチャする方法は?

  1. grep から cp に出力をパイプする方法は?

  2. コマンド出力を複数の引数として別のコマンドに渡す方法

  3. grep 出力から一意の結果を除外するにはどうすればよいですか?

  1. Stdoutに出力し、同時にGrepをファイルに出力しますか?

  2. Linux はリアルタイムクロックをどのように使用しますか?

  3. ps出力をプロセス開始時間でソートする方法は?