Answers:
使用Unix,您可以将一个程序的输出传递到另一个程序。
因此,要过滤尾巴,可以使用grep:
tail -f path | grep your-search-filter
简短答案: tail -f somefile | grep somepattern
但是,这往往不足。假设您要跟踪一个经常旋转的文件(如果是调试日志,它可能会旋转多次)。那tail -F
是你的朋友。我让你看看区别。
但tail -f
并tail -F
打印出一堆第一线,这是在这个用例往往不受欢迎,所以在这种情况下,加-n0
tail -F -n0 somefile | grep somepattern
没问题,直到您想要进行其他过滤,然后才需要注意缓冲。默认情况下, stdout 在写入终端时是行缓冲的,但在写入管道时是全缓冲的。因此,以下内容将在找到行后立即发出,因为它们tail
是显式行缓冲的(或者在每行的末尾刷新其输出),并且grep
也是行缓冲的,因为其输出将发送到您的终端:
tail -F -n0 somefile | grep somepattern
但是随后您决定使用类似的东西awk
或cut
进一步处理输出。
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
现在您想知道输出到哪里去了...根据日志量,您可能会发现确实得到了输出,但是一次却要一页,因为现在stdout grep
是以完全缓冲的方式运行的,因此一次awk
收到输入4kB(默认)。
在这种情况下,您可以grep
使用该--line-buffered
选项告诉总是使stdout行缓冲。
tail -F -n0 somefile | grep --line-buffered somepattern | ...
但是,大多数命令都没有的类似物--line-buffered
。如果使用更多可编写脚本的工具,则可以使用函数来刷新输出(例如,在中awk
,函数为fflush()
,与C语言同名,Perl和Python之类的工具也有类似的用法)。
像cut
你这样的人可能很不幸。...但是您可以尝试搜索unbuffer
,这是我认为expect
工具链提供的功能(我从未使用过)。
我希望您发现这很有用。
干杯,卡梅伦