変更されたファイルを定期的にフィルタリングし、フィルタリングされた出力を新しいファイルにリダイレクトする

変更されたファイルを定期的にフィルタリングし、フィルタリングされた出力を新しいファイルにリダイレクトする

私が持っていると仮定しましょうlog.txt

log.txtのサンプル形式は次のとおりです。 Code Data Timestamp

...
C:57 hello 1644498429
C:56 world 1644498430
C:57 water 1644498433
...

文字列を含む行をフィルタリングするには、C:57次のようにします。

cat log.txt | grep C:57

次に、出力を新しいファイルにリダイレクトします。

cat log.txt | grep C:57 > filtered_log.txt

ただし、log.txtに新しい変更がある場合は、コマンドをもう一度繰り返す必要があります。ファイルに新しい変更があるたびに、または文字列を含む新しい行がある場合にのみ定期的に実行したいと思いますC:57

答え1

次のように使用できますtail -f

tail -f log.txt|grep C:57 >> filtered_log.txt

log.txtこれにより、タグを常に把握し、C:57一致するものをfiltered.log.txt

catログを読み取ってそれをパイプするために使用することはgrep役に立ちませんcatgrepファイルを直接読み取ることができます。 aとaを組み合わせると、catI / Oが無駄になりますgrep

ここでの欠点の1つは、フィルタリングされた出力がバッファリングのために遅延する可能性があることです。これは、次の方法で回避できます。

tail -f log.txt|grep --line-buffered C:57 >> filtered_log.txt

または、次のstdbuf -o0コマンドを使用します。

 tail -f log.txt|stdbuf -o0|grep C:57 >> filtered_log.txt C:57

関連情報