管道不寫入檔案

管道不寫入檔案

我只想獲取從 ping 命令到文件的毫秒數,而不通過管道傳輸到文件,它可以按預期工作。我有點不明白為什麼 > 到一個文件不寫任何東西。

這有效:

ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g'

這不會向 ping.dat 寫入任何內容

ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > ping.dat

我究竟做錯了什麼?

答案1

每個緩衝區|都可能被一個 stdio 輸出緩衝區和一個 stdin 輸入緩衝區包圍。您需要找出需要關閉哪些以獲得即時管道。

這對我有用:

ping localhost |egrep --line-buffered -v 'PING|timeout' |\
stdbuf -o0 sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > file

最初我把每個命令放在stdbuf -i0 -o0前面,然後發現哪些是不必要的。

答案2

如果您使用的是 GNU,那麼-lsed 的選項似乎不正確:您可能需要-u(unbuffered) 選項。而且,這grep是多餘的。您應該能夠從 sed 中獲得您想要的內容:

ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out

抑制-n正常匹配輸出,而s///p強制輸出匹配行。

相關內容