我想在日志文件中(实时)搜索 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