如何通过 awk 和 grep "filter" 尾部输出?

How to "filter" a tail output throug awk and grep?

我喜欢在一个特殊的控制台上过滤一些来自/var/log/syslog的信息。这并不难:

tail -f /var/log/syslog | awk '{print ,,,,"3[1;36m" "3[0m","3[1;33m" "3[0m","3[1;36m" "3[0m","3[1;33m" "3[0m","3[1;38m""3[0m","3[1;32m""3[0m","3[1;31m" "3[0m";}'

但现在我想通过 grep 将其传输到一个特殊字段。只添加一个“| grep Fieldname”是行不通的,甚至不是先 grep,然后再 awk(这会更有意义)。

你能给我一个小费吗?

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

tail -f /var/log/syslog | awk '/Fieldname/ {print ,,,,"3[1;36m" "3[0m","3[1;33m" "3[0m","3[1;36m" "3[0m","3[1;33m" "3[0m","3[1;38m""3[0m","3[1;32m""3[0m","3[1;31m" "3[0m";}'

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

tail -f /var/log/syslog | grep --line-buffered Fieldname | awk '{print ,,,,"3[1;36m" "3[0m","3[1;33m" "3[0m","3[1;36m" "3[0m","3[1;33m" "3[0m","3[1;38m""3[0m","3[1;32m""3[0m","3[1;31m" "3[0m";}'

如果你想grep输出awk,你应该在打印每行后使用fflush()立即刷新缓冲区。

tail -f /var/log/syslog | awk '{print ,,,,"3[1;36m" "3[0m","3[1;33m" "3[0m","3[1;36m" "3[0m","3[1;33m" "3[0m","3[1;38m""3[0m","3[1;32m""3[0m","3[1;31m" "3[0m"; fflush();}' | grep Fieldname