使用典型的Apache访问日志,您可以运行:
tail -f access_log | grep "127.0.0.1"
这将仅显示指定IP地址创建的日志(按它们创建的顺序)。
但是,当您通过grep
第二次进行管道处理以进一步限制结果时,为什么会失败?
例如,对于“.css”的简单排除:
tail -f access_log | grep "127.0.0.1" | grep -v ".css"
不会显示任何输出。
我认为这里的问题在于第一个grep正在缓冲输出,这意味着直到缓冲区被清空后,第二个grep才能看到它。
尝试在第一个grep上添加--line-buffered
选项:
tail -f access_log | grep --line-buffered "127.0.0.1" | grep -v ".css"
更多信息请见"BashFAQ/009 -- 什么是缓冲?或者为什么我的命令行没有输出: tail -f logfile | grep 'foo bar' | awk ...
"
这是缓冲的结果,只有在足够的数据可用时才会最终打印出来。
按照Shawn Chin的建议使用--line-buffered
选项,或者如果stdbuf
可用,则可以通过以下方式获得相同的效果:
tail -f access_log | stdbuf -oL grep "127.0.0.1" | grep -v ".css"