私が持っていると仮定しましょう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
役に立ちませんcat
。grep
ファイルを直接読み取ることができます。 aとaを組み合わせると、cat
I / 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