Answers:
这可能是一个缓冲问题。有关使用管道时禁用自动缓冲的信息,请参见此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
编辑2:unbuffer
可以从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
。
expect
包装。
当使用的命令没有真正“完成”(例如tail -f
)时,这实际上是行不通的(或者根本不行)。
您应该能够将输出重定向到文本文件。尝试这个:
tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt
这是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
}
正如其他人指出的那样,您可以使用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/