我尝试使用以下命令在终端中显示命名管道:
tail -f 文本文件 |剪切-d“”-f 3- | sed -e "s/a/g&g/"
出于某种原因,这不会产生任何输出。
如果删除 -f,它确实会按预期工作:
尾部文本文件 |剪切-d“”-f 3- | sed -e "s/a/g&g/"
或者删除cut语句:
tail -f 文本文件 | sed -e "s/a/g&g/"
或者删除sed语句:
tail -f 文本文件 |剪切-d ""-f 3-
只有当所有这三个东西都在一起时,它突然不再产生任何输出。 sed 和 cut 的顺序没有区别。所有这些让我很难责怪任何一个或一对这些程序的输入或输出缓冲行为。
获得所需功能的可能解决方案是 while read line
结构,但我想尽可能避免为每一行初始化命令。
最佳答案
我遇到了与我想过滤的 ping 命令类似的情况。
以下网页似乎解释了问题所在(stdio 缓冲) http://www.pixelbeat.org/programming/stdio_buffering/
该网站指出了一个解决方案,该解决方案涉及使用“stdbuf”命令禁用缓冲
tail -f filename | stdbuf -o0 cut -d " " -f 3- | sed -e "s/a/g&g/"
以上对我来说效果很好,删除“stdbuf -o0”会导致不显示任何输出。
>stdbuf --help
Usage: stdbuf OPTION... COMMAND
Run COMMAND, with modified buffering operations for its standard streams.
Mandatory arguments to long options are mandatory for short options too.
-i, --input=MODE adjust standard input stream buffering
-o, --output=MODE adjust standard output stream buffering
-e, --error=MODE adjust standard error stream buffering
--help display this help and exit
--version output version information and exit
关于linux - 管道 tail -f 切割到 sed 不产生任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38252123/