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

Mik*_*ike 40 cygwin bash grep logging

作为我上一篇文章的延续,我曾经在那里grep & tail -f找到“罕见”事件的发生。我想把它记录在另一个文件中。

我试过转

tail -f log.txt | egrep 'WARN|ERROR'
Run Code Online (Sandbox Code Playgroud)

进入

tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
Run Code Online (Sandbox Code Playgroud)

该文件已创建,但没有填充任何内容,这是缓存问题还是其他问题?我如何将尾部的输出实时附加到新文件中?

nik*_*nik 49

缓冲是问题。

这样做,

tail -f log.txt | egrep --line-buffered 'WARN|ERROR' | 三通filtered_output.txt
#^^^^^^^^^^^^^^^^

确认也可以在 Cygwin 上工作。


qua*_*ote 6

这可能是一个缓冲问题。请参阅有关在使用管道时禁用自动缓冲的 SO 帖子。您可以使用以下unbuffer命令expect

$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt
Run Code Online (Sandbox Code Playgroud)

编辑:由于您有更长的管道,您可能需要取消缓冲每个命令(最后一个除外):

$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt
Run Code Online (Sandbox Code Playgroud)

编辑 2unbuffer在 Cygwin 上可以从expect源包中获得(例如,在文件夹中找到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
Run Code Online (Sandbox Code Playgroud)

在 Debian 上,该unbuffer命令在expect-dev包中提供并安装为expect_unbuffer.