组合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

尾-f 防火墙.log | sed -nu '/msg=/{s/.味精=//;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

相关内容