![管道不寫入檔案](https://rvso.com/image/83684/%E7%AE%A1%E9%81%93%E4%B8%8D%E5%AF%AB%E5%85%A5%E6%AA%94%E6%A1%88.png)
我只想獲取從 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,那麼-l
sed 的選項似乎不正確:您可能需要-u
(unbuffered) 選項。而且,這grep
是多餘的。您應該能夠從 sed 中獲得您想要的內容:
ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out
抑制-n
正常匹配輸出,而s///p
強制輸出匹配行。