2015-12-19 33 views
0

當使用grep -r "something" .時,它會打印輸出,因爲找到了某些東西。Bash沒有等到管道完整的結果,而是直接輸出直接的動作

無論什麼時候使用管道進行後處理,它都會等待,直到收到所有輸出爲止。

每行管道有某種方式/語法嗎?

不要改進例子麻煩,這真的只是一個例子:

grep -r "something" . | grep -v "somethingelse" # excluding somethingelse 

結果只會在那裏一切都已經被搜查(因爲管道|的)之後,但我當「線路變得可用」時尋找將在來自grep -r "something" .的每條線上作出響應的語法。

可以通過管道連接到等待輸入的程序,並處理任何到達它的程序,但是使用管道只會將數據發送給它,因爲它完全完成了嗎?

有沒有人有想法?

+0

如果您安裝了expect軟件包,則可以使用'unbuffer'命令。討論類似的問題[這裏](http://stackoverflow.com/questions/3465619/how-to-make-output-of-any-shell-command-unbuffered) –

+0

@BalajiSukumaran確實這是一個重複的,不知道找到它的術語。謝謝! – PascalVKooten

回答

1

隨着grep,您可以使用--line-buffered選項。如果程序沒有一個類似的選項,你可以使用stdbuf程序,例如:

tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq 

在這個例子中stdbuf運行cut程序,其輸出流修改爲行緩衝。

+0

在顯示結果之前,管道是否讓我們等待尾部停止(它不會)? – PascalVKooten

+0

這不是讓我們等待的管道。它是連接到該管道的輸出流的緩衝模式。 – user2683246

+0

爲什麼'grep -rs「是」/ |「/usr/local/opt/coreutils/libexec/gnubin/stdbuf -oL echo「$(date)'只產生1行輸出? – PascalVKooten

1

使用grep--line-buffered選項:

--line-buffered 
     Force output to be line buffered. By default, output is line 
     buffered when standard output is a terminal and block buffered 
     otherwise. 
+0

我正在尋找一個比'grep'更多的選項,儘管它是一個很好的發現。 – PascalVKooten

相關問題