将 tail -f 导入到 awk 中

将 tail -f 导入到 awk 中

我正在尝试将 tail -f 插入 awk 来实时监控日志文件,但是根据示例,应该没有问题,但我无法让它工作。

这是我正在运行的命令

tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'

但是当我使用 nano 添加行来编辑文件时,它不会实时打印,如果我直接运行 awk 命令,我的新行就会出现在结果中。

答案1

您无法实时看到它,因为为了提高效率,管道是缓冲的。 tail -f在将输出传递给之前,必须填满缓冲区(通常为 4 kB)awk

解决方法是使用 expect 包中的 unbuffer 命令:

unbuffer tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'

这会让人误tail以为它正在向交互式终端写入数据。结果,它不会缓冲。

有关详细信息,请参阅https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

或者,如果您拥有 GNU coreutils 7.5 或更高版本,则可以使用 stdbuf 命令禁用输出缓冲:

stdbuf -o0 tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'

答案2

@John1024 的替代答案不太正确,因为stdbuf -o0前缀放错了位置。它属于awk命令的前缀,而不是tail -f命令本身,因此正确的命令应该是:

tail -f logfile.log | stdbuf -o0 awk -F" " '{print $1, $2, $7, $8}'

这对我来说是有效的,但只有在我找到一个可以配合的 awk 版本之后才有效。因此请注意并非所有版本的 awk 都允许这样做! 我不得不尝试 nawk、gawk、mawk 等,直到找到一个有效的。如果您需要该特定命令字符串按书写方式运行,请继续尝试各种 awk/gawk/mawk 版本,明确说明 awk 二进制文件的路径,甚至下载其他版本,直到找到一个有效的版本。

答案3

在 Ubuntu 20.10 上,awk链接到mawk版本 1.3.4,

添加-W interactive. 例如tail -f $file | awk -W interactive '{print}'

(感谢其他人的回答,促使我阅读手册页来寻找buffer。)

答案4

stdbuf 和 unbuffer 似乎都不适合我(Ubuntu 18.04),但使用命名管道可以。我创建了一个包含以下内容的 shell 脚本:

mkfifo /tmp/pipe
awk -F" " '{print $1, $2, $7, $8}' < /tmp/pipe &
tail -f input.log > /tmp/pipe

相关内容