結合された 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/.メッセージ=//;s/\S=.*//;p}' | stdbuf -o0 awk '!seen[$0]++' >> outfile.txt

男は言った;

-u, --バッファなし

入力ファイルから最小限のデータをロードし、出力バッファをより頻繁にフラッシュする

マニュアルstdbuf;

stdbuf - 標準ストリームのバッファリング操作を変更して COMMAND を実行します。

-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

関連情報