如何对“tail -f”的实时输出应用过滤器?

如何对“tail -f”的实时输出应用过滤器?
tail -f path

以上将立即输出对文件的修改,但我想对输出应用过滤器,仅xxx在其中包含关键字时显示。

该如何处理这个问题?

答案1

使用 Unix,您可以通过管道将一个程序的输出传送到另一个程序。

因此,要过滤尾部,可以使用 grep:

tail -f path | grep your-search-filter

答案2

简短回答: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

但随后您决定使用类似awkcut进一步处理输出。

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

现在您想知道您的输出去了哪里...根据日志的数量,您可能会发现确实获得了输出,但每次只能输出一页,因为现在的标准输出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(我从未使用过它)。

我希望你发现这篇文章有用。

干杯,卡梅伦

答案3

并且您可以使用多个管道和 grep,并使用 grep -v 排除某些内容,使用 grep -i 获得不区分大小写等。

例如:tail -100f /var/log/messages | grep -V ACPI | grep -i ata

从末尾开始拖尾 100 行,并继续拖尾,首先排除任何带有 ACPI 的行,然后显示带有 ata、ATA 或任何混合的行。

另一个方便的是 ABC 选项,用于 After 行、Before 行和 Context 行(前后行)。

相关内容