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