tail -f path
Run Code Online (Sandbox Code Playgroud)
以上将立即输出对文件的修改,但我想对输出应用过滤器,仅在其中有关键字时显示xxx。
如何处理这个问题?
Add*_*sUK 93
使用 Unix,您可以将一个程序的输出通过管道传输到另一个程序中。
所以要过滤tail,你可以使用grep:
tail -f path | grep your-search-filter
Run Code Online (Sandbox Code Playgroud)
Cam*_*err 24
简短的回答: tail -f somefile | grep somepattern
然而,这往往达不到要求。假设您正在跟踪一个经常轮换的文件(如果它是调试日志,它可能会轮换多次)。在这种情况下tail -F是你的朋友。我让你查一下区别。
但是,tail -f和tail -F在这种情况下附加打印出一堆第一线,这是在这个用例往往不受欢迎,所以-n0
tail -F -n0 somefile | grep somepattern
Run Code Online (Sandbox Code Playgroud)
这会很好,直到您想做一些其他过滤,然后您需要注意缓冲。标准输出在写入终端时默认为行缓冲,但在写入管道时为全缓冲。因此,以下将在找到行后立即发出行,因为它tail是显式行缓冲的(或者它在每行末尾刷新其输出),并且grep也是行缓冲的,因为它的输出将发送到您的终端:
tail -F -n0 somefile | grep somepattern
Run Code Online (Sandbox Code Playgroud)
但是随后您决定使用类似的东西awk或cut进一步处理输出。
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)
现在你想知道你的输出去了哪里......根据日志的数量,你可能会发现你确实得到了输出,但它一次是一个页面,因为现在标准输出grep以全缓冲方式运行,因此一次awk接收它输入 4kB(默认情况下)。
在这种情况下,您可以告诉grep始终使用该--line-buffered选项缓冲 stdout 行。
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Run Code Online (Sandbox Code Playgroud)
但是,大多数命令没有类似的--line-buffered. 在更多脚本化工具的情况下,您可以使用一个函数来刷新输出(例如,在 中awk,函数 is fflush(),它与 C 对应物共享相同的名称,像 Perl 和 Python 这样的工具有类似的东西)。
像cut你这样的人可能不走运;...但您可以尝试搜索unbuffer,我认为这是expect工具链提供的东西(我从未使用过它)。
我希望你发现这很有用。
干杯,卡梅伦