将tail -f的输出导入到cut和sed中没有产生任何输出

4
我尝试使用以下命令在终端中显示一个命名管道:
tail -f textFile | cut -d " " -f 3- | sed -e "s/a/g&g/"
由于某种原因,它没有产生任何输出。
如果去掉-f选项,则可以按预期工作:
tail textFile | cut -d " " -f 3- | sed -e "s/a/g&g/"
或者去掉cut语句:
tail -f textFile | sed -e "s/a/g&g/"
或者去掉sed语句:
tail -f textFile | cut -d " " -f 3-
只有当这三个东西一起出现时,它突然不再产生任何输出。 sed和cut的顺序没有影响。所有这些都使我很难将输入或输出缓冲行为归咎于任何一个或一对这些程序。
一个可能的解决方案是使用while read line结构来获得所需的功能,但如果可能的话,我想避免为每行初始化一个命令。

提供textFile的样本行,以便调查原因! - Inian
1
这其实并不重要。为了测试目的,我正在使用一个文本文件,其中包含内容:aaaaaaaaaaaaaaaaaaaaa \n bbbbbbbbbbbbbbbb - cyborgx7
你能否尝试以下命令:tail -f textFile | while read text; do echo "$text" | cut -d " " -f 3- | sed -e "s/a/g&g/; done。因为我猜测这是tailcut分别处理它们的输出和输入流的方式。如果有效,我会将其发布为答案。 - Inian
这个可以工作(如果你添加缺失的“),但我已经在我的原始帖子中解释了为什么我宁愿避免这种解决方案。 - cyborgx7
1个回答

3
我遇到了一个类似的问题,想要过滤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

2
你指向的文章提到使用-oL来进行面向行的吞吐量(据我所知,tail和cut会产生这种情况),为什么你选择了-o0呢? - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接