Shell

將命令的輸出通過管道傳輸到 grep,然後再傳輸到另一個命令

  • April 30, 2018

我正在獲取一個腳本的輸出,然後將此 putput 傳輸到 grep 並將 grep 的輸出傳輸到另一個腳本:

./script1 | grep 'expr' | ./script2

但是,第二個腳本永遠不會得到任何輸入。同樣,當我script2catscript1替換時,什麼也沒有列印出來ping

ping localhost | grep localhost | cat

grep如果我替換為,也會發生同樣的事情awk

ping localhost|awk '{print $1}'|cat

到底是怎麼回事?

grep正在緩衝(因為它確定其輸出不是終端;嚴格來說,這是 C 庫的行為)。

要禁用此功能,請使用以下命令執行它unbuffer -p(從其標準輸入中讀取-p是必需的):unbuffer

ping localhost | unbuffer -p grep localhost | cat

或告訴grep逐行緩衝(如果它支持的話):

ping localhost | grep --line-buffered localhost | cat

引用自:https://unix.stackexchange.com/questions/440878