grep 和 sed 与 tail -f 的管道似乎正在缓存

grep 和 sed 与 tail -f 的管道似乎正在缓存

我正在尝试让一个工作系统来监控特殊日志。我通常只想要一个非常具体的模式,然后使用grep管道从中提取tail -f。我注意到 grep 不会输出所有内容,而是保留一些缓冲行。我想如果你有一个管道可以输出所有内容然后终止并关闭流,那就说得通了。
tail -f对我来说,这行不通。

也出现了同样的问题sed

这是我想要使用的示例命令:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'

举个例子:

上面命令的最后一行是这样的:

2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x

并使用此命令:

clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g

最后一行是这样的:

2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y

删除进一步的管道可以让我进一步获得最新的条目。

我怎样才能避免管道中的这种缓存?

答案1

添加grep的选项--line-bufferedsed的选项--unbuffered

答案2

使用grep--line-buffered选项。

默认情况下,如果实用程序的标准输出是终端,则使用行缓冲,但当其输出连接到文件描述符或管道时,则使用更大的缓冲区(可能是 4 或 8 kB)。

您很幸运,tail -F默认情况下使用行缓冲,并且grep有一个命令行选项可以启用它。我不知道有通用方法可以为任意命令启用行缓冲。

相关内容