【问题标题】:How to "filter" a tail output throug awk and grep?如何通过 awk 和 grep “过滤”尾部输出?
【发布时间】:2016-07-09 22:59:44
【问题描述】:

在一个特殊的控制台上,我喜欢从 /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(这更有意义)。

你能给我小费吗?

【问题讨论】:

    标签: linux bash awk grep tail


    【解决方案1】:

    不要使用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
    

    【讨论】:

    • 嗨 Barmar,'/Fieldname/' 正是我需要的。非常感谢! :-)
    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多