是sed阻止?

时间:2009-02-23 14:53:40

标签: unix sed pipe netcat

我的印象是sed没有阻挡,因为当我说:

iostat | sed

sed会在数据到达时对其进行处理,但是当我执行

iostat | sed | netcat

然后sed阻止netcat

我是对的吗?

4 个答案:

答案 0 :(得分:19)

sed不打印到终端时,它将在缓冲模式下工作。这意味着它会在执行任何处理和默认输出之前尝试填充其内部缓冲区。

这样做是为了增加吞吐量,因为通常在管道中你不关心时间,但想要在给定时间内处理尽可能多的数据。

-u传递给sed将告诉它无缓冲工作,因此工作方式与输出到终端时的工作方式相同。

答案 1 :(得分:3)

除了@saua所说的,sed至少是面向行的,它是读取一行,然后对它进行操作,因此它总是至少缓冲一行。此外,sed可以在多行模式下工作。如果您使用多行模式,那么sed无法输出它的当前缓冲区,直到它知道该模式不适用或模式已被处理。

答案 2 :(得分:1)

我不知道我是否理解这个问题,但在你的例子中,它应该是这样的:

  • sed等待iostat发送数据
  • 如果sed很慢,
  • iostat将等待sed处理数据
  • netcat等待sed发送数据
  • sed将再次等待netcat,如果它很慢

除此之外,sed不需要读取所有输入来产生输出。

您是否观察到任何无法解释的延迟和一些小缓冲?

答案 3 :(得分:0)

stdbuf可以帮助改变标准io流的缓冲行为。您可以尝试这样来更改缓冲行为:

... | stdbuf -oL -eL sed -e ... | ...