2009-02-23 224 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 ... | ...