msg = "yxyxyx"コンテンツのログファイルを(リアルタイムで)検索し、outfile.txtに一意の値を書きたいです。
私はこれを書いた:
tail -f /var/log/firewall.log | sed -n '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | awk '!seen[$0]++' >> outfile.txt
出力ファイルが生成されましたが空です。 >> outfile.txt 部分なしでコンソールに完全に記録します。
ありがとうございます!
答え1
以下のように、awkコマンドの前にstdbuf -oLまたはstdbuf -o0を使用できますか?
tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt
Tail -fファイアウォール.log | sed -nu '/msg=/{s/.MSG=//;s/\S=.*//;p}' | stdbuf -o0 awk '!seen[$0]++' >> outfile.txt
人々はsedです。
-u, --バッファリングなし
入力ファイルから最小限のデータをロードし、出力バッファをより頻繁にフラッシュします。
人stdbuf;
stdbuf - コマンドを実行し、標準ストリームバッファリング操作を変更します。
-o, --output=MODE 標準出力ストリームバッファリング調整
MODEが“L”の場合、そのストリームはラインバッファリングされます。このオプションは標準入力には影響しません。
MODEが"0"の場合、そのストリームはバッファリングされません。
例えば。
まずこれを実行します。
user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt
他の端末を実行すると、echo msg="1" >> firewall.log
出力は次のようになります。
user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt
user@host$ cat outfile.txt
1
同じジョブを再実行してもecho msg="1" >> firewall.log
出力は変わりません。
実行後;echo msg="2" >> firewall.log
出力は次のとおりです。
user@host$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt
user@host$ cat outfile.txt
1
2