我正在尝试让一个工作系统来监控特殊日志。我通常只想要一个非常具体的模式,然后使用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-buffered
和sed
的选项--unbuffered
。
答案2
使用grep
的--line-buffered
选项。
默认情况下,如果实用程序的标准输出是终端,则使用行缓冲,但当其输出连接到文件描述符或管道时,则使用更大的缓冲区(可能是 4 或 8 kB)。
您很幸运,tail -F
默认情况下使用行缓冲,并且grep
有一个命令行选项可以启用它。我不知道有通用方法可以为任意命令启用行缓冲。