Sed
從 curl 輸出中提取下載進度
我正在嘗試提取正在檢索的文件的下載進度
curl
。我試過這個,但這不起作用:
curl --progress-bar http://127.0.0.1/test.tar.bz2 -o test.tar.bz2 2>/dev/stdout | sed -r 's/[# ]//g;s/^/#/g'
sed
表達似乎很好:$ echo '######## 10.2%' | sed -r 's/[# ]//g;s/^/#/g' #10.2%
誰能指出我做錯了什麼?
主要問題是它
sed
可以線上執行,因此在到達第一個之前它不會做任何事情\n
,並且在你的命令完成之前不會發生。您可以通過將\r
s 與\n
s 交換來解決此問題:$ curl --progress-bar http://127.0.0.1/test.tar.bz2 -o test.tar.bz2 2>&1 | tr $'\r' $'\n' | sed -r 's/[# ]+/#/g;'
但是,這會使您反對緩衝,
sed
現在將作用於多組行。我一起破解的最終解決方案是將錯誤重定向到一個文件,然後處理該文件:$ curl --progress-bar http://127.0.0.1/test.tar.bz2 -o test.tar.bz2 2>er $ while :; do echo -ne "$(tr $'\r' $'\n' < er | tail -n 1 | sed -r 's/^[# ]+/#/;')\r"; done
上面的命令將解析錯誤文件 (
er
) 並列印結果並\r
使其不斷更新。您將需要手動打破它。*來自一位匿名使用者的建議:*您也可以
stdbuf -oL
在前面放置這些命令tr
,sed
從而修改這些命令的緩衝行為。