2016-03-22 33 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