为什么我不能通过管道多次过滤尾部的输出?

时间:2016-04-24 12:08:08

标签: sed grep pipe tail

出乎意料的是,这失败了(没有输出;尝试过 sh zsh bash ):

echo "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | sed 's#pl#st#g'

请注意, grep 两次也会失败,表明与使用哪些命令无关:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played | grep played
单独运行

grep

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | grep played
played

sed 单独工作:

# echo -e "foo\nplayed\nbar" > /tmp/t && tail -f /tmp/t | sed 's#pl#st#g'`
foo
stayed
bar

使用 cat 而不是 tail ,它可以正常工作:

# echo -e "foo\nplayed\nbar" > /tmp/t && cat /tmp/t | grep played | sed 's#pl#st#g'
stayed

journalctl --follow,与tail一样失败。

无法管道两次的原因是什么?

1 个答案:

答案 0 :(得分:1)

这是一个缓冲问题 - 第一个grep在它输出到另一个命令时缓冲它的输出,但是如果它正在打印到stdout则不会。有关其他信息,请参阅http://mywiki.wooledge.org/BashFAQ/009