2016-03-22 34 views
1

在特殊的控制台上,我喜欢过滤来自/ var/log/syslog的一些信息。这并不十分棘手:如何通过awk和grep“过滤”尾部输出?

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稍后(这会更有意义)。

你能给我一个小费吗?

回答

3

不要使用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";}' 

如果你想grepawk输出,你应该在打印每一行立即刷新缓冲区后使用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 
+0

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