grep和sed with tail from tail -f似乎是缓存


2

我正在尝试使用一个工作系统来监控特殊日志。我通常只想要一个非常具体的模式,我提取使用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

删除更多管道让我进一步了解最新的条目。

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

Answers:


6

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


egmont解释得更好,但你也给了我正确的选择sed
BrainStone 2015年

来自grep的联机帮助页的提示:这可能会导致性能下降。
赛勒斯2015年

我是这么想的。但这并不会真正影响我们,因为一台好的服务器应该能够处理每分钟最多几行。但是谢谢你的警告反正..
BrainStone 2015年

2

使用grep--line-buffered选项。

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

你很幸运,tail -F默认使用行缓冲,并grep有一个命令行选项来启用它。我不知道为任意命令启用行缓冲的通用方法。


1
对于任意命令,您可以使用unbuffer实用程序
约翰1024年

谢谢; 在平均时间我发现了stdbuf似乎更标准的实用程序:stackoverflow.com/questions/3465619 / ...
egmont 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.