Sed

從 curl 輸出中提取下載進度

  • October 10, 2020

我正在嘗試提取正在檢索的文件的下載進度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,並且在你的命令完成之前不會發生。您可以通過將\rs 與\ns 交換來解決此問題:

$ 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在前面放置這些命令trsed從而修改這些命令的緩衝行為。

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