如何通过 awk 和 grep 进行"过滤" tail 输出?

3
在一个特殊的控制台上,我喜欢从/var/log/syslog中筛选一些信息。这并不是非常棘手:
tail -f /var/log/syslog | awk '{print $2,$1,$9,$3,"\033[1;36m"$17 "\033[0m","\033[1;33m"$23 "\033[0m","\033[1;36m"$19 "\033[0m","\033[1;33m"$24 "\033[0m","\033[1;38m"$26"\033[0m","\033[1;32m"$13"\033[0m","\033[1;31m"$20 "\033[0m";}'

现在我想将这个内容通过grep筛选出特定字段。仅仅添加"| grep Fieldname"是不起作用的,甚至先grep再awk也不行(尽管这样做更有意义)。

您能给我一些提示吗?

1个回答

11

不要使用 grep,在 awk 中进行模式匹配。

tail -f /var/log/syslog | awk '/Fieldname/ {print $2,$1,$9,$3,"\033[1;36m"$17 "\033[0m","\033[1;33m"$23 "\033[0m","\033[1;36m"$19 "\033[0m","\033[1;33m"$24 "\033[0m","\033[1;38m"$26"\033[0m","\033[1;32m"$13"\033[0m","\033[1;31m"$20 "\033[0m";}'

如果您真的需要使用grep,可以使用--line-buffered选项,这样它就不会缓冲输出。

tail -f /var/log/syslog | grep --line-buffered Fieldname | awk '{print $2,$1,$9,$3,"\033[1;36m"$17 "\033[0m","\033[1;33m"$23 "\033[0m","\033[1;36m"$19 "\033[0m","\033[1;33m"$24 "\033[0m","\033[1;38m"$26"\033[0m","\033[1;32m"$13"\033[0m","\033[1;31m"$20 "\033[0m";}'

如果您想要使用 grep 命令来筛选 awk 的输出结果,那么在每行打印后应该使用 fflush() 来立即清空缓冲区。

tail -f /var/log/syslog | awk '{print $2,$1,$9,$3,"\033[1;36m"$17 "\033[0m","\033[1;33m"$23 "\033[0m","\033[1;36m"$19 "\033[0m","\033[1;33m"$24 "\033[0m","\033[1;38m"$26"\033[0m","\033[1;32m"$13"\033[0m","\033[1;31m"$20 "\033[0m"; fflush();}' | grep Fieldname

嗨Barmar,'/Fieldname/'正是我所需要的。非常感谢! :-) - NoName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接