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


34

从延续我的过去后,我已经用grep & tail -f找到的“罕见”事件的出现次数。我想将此记录在另一个文件中。

我试过转

tail -f log.txt | egrep 'WARN|ERROR'

进入

tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt

文件已创建,但没有填充,这是缓存问题还是其他原因?我如何将我的尾巴输出实时追加到新文件中?

Answers:


44

缓冲是问题所在。

这样子

尾-f log.txt | egrep-行缓冲'WARN | ERROR'| 三通filtered_output.txt
#^^^^^^^^^^^^^^^^

确认也可以在Cygwin上工作。


6

这可能是一个缓冲问题。有关使用管道时禁用自动缓冲的信息,请参见此SO帖子。您可以使用以下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可以从expect源软件包中在Cygwin上使用(例如,在文件夹中找到Expect-20030128-1-src.tar.bz2expect/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


有没有办法用cygwin做到这一点?
迈克,

添加了在cygwin中使用的信息;您需要expect包装。
09年

谢谢,直到现在星期一才能尝试。然后会更新。
迈克,

4

当使用的命令没有真正“完成”(例如tail -f)时,这实际上是行不通的(或者根本不行)。

您应该能够将输出重定向到文本文件。尝试这个:

tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt

1
这似乎不起作用。
迈克,

2

这是unbuffer我的版本:

#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST

if {[string compare [lindex $argv 0] "-p"] == 0} {
    # pipeline
    set stty_init "-echo"
    eval spawn -noecho [lrange $argv 1 end]
    close_on_eof -i $user_spawn_id 0
    interact {
    eof {
        # flush remaining output from child
        expect -timeout 1 -re .+
        return
    }
    }
} else {
    set stty_init "-opost"
    set timeout -1
    eval spawn -noecho $argv
    expect
}

+1感谢您提供其他信息。dunno,如果它是cygwin友好的,但是它看起来像一个更智能的脚本。
2009年

2

正如其他人指出的那样,您可以使用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/

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.