将“tail -f”输出写入另一个文件

将“tail -f”输出写入另一个文件

作为延续我最后一篇帖子我曾经在这里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

编辑2unbuffer可在 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

正如其他人指出的那样,您可以使用unbufferExpect 中的实用程序。

但请注意,根据您的系统和可用的 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/

相关内容