ログファイル(リアルタイム)で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