作为延续我最后一篇帖子我曾经在这里grep & tail -f
查找“罕见”事件的发生。我想将其记录在另一个文件中。
我试过
tail -f log.txt | egrep 'WARN|ERROR'
进入
tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
文件已创建,但未填充任何内容,这是缓存问题还是其他问题?如何将 tail 的输出实时附加到新文件?
答案1
缓冲是一个问题。
这样做,
tail -f log.txt | egrep --line-buffered 'WARN|ERROR' | teefiltered_output.txt #^^^^^^^^^^^^^^^^
确认也可在 Cygwin 上运行。
答案2
这可能是缓冲问题。请参阅此内容关于使用管道时禁用自动缓冲的帖子。您可以使用以下unbuffer
命令expect
:
$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
编辑:由于您有更长的管道,您可能需要取消缓冲每个命令(最后一个命令除外):
$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
编辑2:unbuffer
可在 Cygwin 的expect
源包中找到(例如预期-20030128-1-src.tar.bz2(位于expect/examples
文件夹中),但这是一个非常短的脚本。如果您已经expect
安装了该包,只需将其放入目录unbuffer
中名为的脚本中/usr/local/bin
:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
在 Debian 中,该unbuffer
命令在包中提供expect-dev
并安装为expect_unbuffer
。
答案3
当使用一个实际上并未“完成”的命令(例如tail -f
)时,这实际上根本不起作用或根本不起作用。
您应该能够将输出重定向到文本文件。 尝试以下操作:
tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt
答案4
正如其他人指出的那样,您可以使用unbuffer
Expect 中的实用程序。
但请注意,根据您的系统和可用的 Expect 版本,您可能需要使用开关-p
来取消缓冲。引用手册页:
Normally, unbuffer does not read from stdin. This simplifies use of unbuffer in some situations. To use unbuffer in a pipeline, use
the -p flag. Example:
process1 | unbuffer -p process2 | process3
因此你可能需要这个调用:
unbuffer -p tail -f log.txt | unbuffer -p egrep 'WARN|ERROR' | tee filtered_output.txt
顺便说一句,请参阅本文以详细解释输出缓冲问题:http://www.pixelbeat.org/programming/stdio_buffering/