我尝试将聊天日志文件通过管道传输到某些语音输出,并希望使用 删除时间戳cut
并删除特殊字符tr
。不幸的是,当与以下命令结合cut
使用时似乎会停止:tail -f
tr
//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/并且似乎没有解决办法。