将“tail -f”与“tr”结合使用时,“cut”会挂起

将“tail -f”与“tr”结合使用时,“cut”会挂起

我尝试将聊天日志文件通过管道传输到某些语音输出,并希望使用 删除时间戳cut并删除特殊字符tr。不幸的是,当与以下命令结合cut使用时似乎会停止:tail -ftr

//works
$ tail /path/to/chatlogs | cut -b18- 
test
test

//works, too
$ tail /path/to/chatlogs | tr -C -d  '[:alnum:][:cntrl:] '
test
test

// does not work
$ tail -f /path/to/chatlogs | tr -C -d  '[:alnum:][:cntrl:] ' | cut -b18-
//no output

为什么?我该如何解决这个问题?


当管道两次进入时它甚至会挂起cut

$ tail -f file | cut -b5- | cut -b5-
//no output

答案1

您使用的语法仅处理 上的新输入/path/to/chatlogs。尝试运行命令并记录新条目/path/to/chatlogs并查看输出是什么或尝试:

tail -1000f /path/to/chatlogs | tr -C -d  '[:alnum:][:cntrl:] ' | cut -b18-

也处理最后 1000 行。

“挂起”部分实际上是tail等待进一步输入通过管道传递的进程。

要从tr命令中禁用缓冲,请使用:

tail -f /path/to/chatlogs | stdbuf -i0 -oL tr -C -d  '[:alnum:][:cntrl:] ' | cut -b18-

以上使用自关闭管道中的缓冲

答案2

当使用多个管道时,我遇到了 stdio 缓冲问题。

该问题的详细描述位于http://www.pixelbeat.org/programming/stdio_buffering/并且似乎没有解决办法。

相关内容