Linuxコマンドを組み合わせると、outfile.txtに書き込まれません。

Linuxコマンドを組み合わせると、outfile.txtに書き込まれません。

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

おすすめ記事