我的印象是sed没有阻挡,因为当我说:
iostat | sed
sed
会在数据到达时对其进行处理,但是当我执行
iostat | sed | netcat
然后sed
阻止netcat
。
我是对的吗?
答案 0 :(得分:19)
sed
不打印到终端时,它将在缓冲模式下工作。这意味着它会在执行任何处理和默认输出之前尝试填充其内部缓冲区。
这样做是为了增加吞吐量,因为通常在管道中你不关心时间,但想要在给定时间内处理尽可能多的数据。
将-u
传递给sed将告诉它无缓冲工作,因此工作方式与输出到终端时的工作方式相同。
答案 1 :(得分:3)
除了@saua所说的,sed
至少是面向行的,它是读取一行,然后对它进行操作,因此它总是至少缓冲一行。此外,sed
可以在多行模式下工作。如果您使用多行模式,那么sed
无法输出它的当前缓冲区,直到它知道该模式不适用或模式已被处理。
答案 2 :(得分:1)
我不知道我是否理解这个问题,但在你的例子中,它应该是这样的:
除此之外,sed不需要读取所有输入来产生输出。
您是否观察到任何无法解释的延迟和一些小缓冲?
答案 3 :(得分:0)
stdbuf
可以帮助改变标准io流的缓冲行为。您可以尝试这样来更改缓冲行为:
... | stdbuf -oL -eL sed -e ... | ...