2009-02-23 133 views
6

我的sed的印象并没有阻止,因为当我不这样说:是sed阻塞?

iostat | sed 

sed处理数据,因为它来了,但是当我做

iostat | sed | netcat 

然后sednetcat

对吗?

回答

14

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

这样做是为了提高吞吐量,因为通常在管道中,您并不关心时间,但希望尽可能多地在给定的时间内处理数据。

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

+0

sed的:非法选项 - U – CommaToast 2016-08-15 22:55:10

1

我不知道我理解的问题的权利,但在你的榜样,它应该是这样的:

  • SED等待iostat的发送数据
  • 的iostat会等的sed工艺对于sed的发送数据,如果sed的数据是慢
  • netcat的等待
  • 的sed将等待再次的netcat,如果是慢

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

您是否观察到无法通过此缓冲和某些小缓冲解释的延迟?

3

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

0

stdbuf可以协助改变标准io流的缓冲行为。你可以试试这个改变缓冲行为:

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