如何通过 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
我喜欢在一个特殊的控制台上过滤一些来自/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