Bash

無法使用管道處理標準輸出

  • April 15, 2013

我在 fifo 上執行 tshark,以下是一個簡單的循環範例,該循環列印 tshark 的輸出

tshark -i $fifo | while read line; do
   echo $line
done

當我向 tshark 添加過濾器時出現問題。$line此範例僅在 tshark 退出(隱藏 IP 地址)後列印所有s:

tshark -i $fifo -T fields -e text -R '
   ip.src == **.**.***.**          &&
   http.response.code == 200       &&
   http.content_encoding == "gzip" &&
   http.content_type contains "text/html"
' | while read line; do
   echo $line
done

我嘗試過其他形式但沒有運氣:

while read line; do
   echo $line
done < <(tshark ...)

while read line; do
   echo $line
done <<<"$(tshark ...)"

甚至 grep 也僅在 tshark 結束後列印行:

tshark ... | grep .

我嘗試在沒有管道的情況下執行 tshark,並且線條在出現時正確列印。為什麼管道後的命令只有在 tshark 退出後才被輸入?

附加細節: | tee有效,但是當 tshark 退出時,我會再次列印所有內容,所以這不是一個好交易。

檢查您的[tshark](http://www.wireshark.org/docs/man-pages/tshark.html)版本是否具有-l(幾乎)行緩衝輸出的選項。

我能夠stdbuf從 coreutils 使用它。請注意,管道之後的每個命令也需要調整緩衝區:

stdbuf -o 0 tshark -i $fifo -T fields -e text -R '
   ip.src == **.**.***.**          &&
   http.response.code == 200       &&
   http.content_encoding == "gzip" &&
   http.content_type contains "text/html"
' | 
stdbuf -o 0 sed 's/\\r\\n,\?/\n/g; s/\\t/\t/g' |

從手冊頁:

`stdbuf': Run a command with modified I/O stream buffering

(...)

`-o MODE'
`--output=MODE'
    Adjust the standard output stream buffering.

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