私が走るとき
curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
次の出力が表示されます(赤色)。
100 1270 100 1270 0 0 318 0 0:00:04 0:00:04 0:00:00 318
私が望むのは、cURLプログレスバーの最後の行を表示することです。更新するとき(実際には特定の列だけを表示したいのですが、行全体を表示してもかまいません。)
希望の出力(時間t = 1秒):
user@comp:~/Desktop/$ curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
25 1270 25 318 0 0 318 0 0:00:01 0:00:01 0:00:03 318
希望の出力(時間t = 2秒):
user@comp:~/Desktop/$ curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
50 1270 50 636 0 0 318 0 0:00:02 0:00:02 0:00:02 318
希望の出力(時間t = 3秒):
user@comp:~/Desktop/$ curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
75 1270 75 954 0 0 318 0 0:00:03 0:00:03 0:00:01 318
希望の出力(時間t = 4秒):
user@comp:~/Desktop/$ curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"
100 1270 100 1270 0 0 317 0 0:00:04 0:00:04 0:00:00 0
cURLとgrepでウォッチを試してみましたが、まだ動作しません(出力なし)。
watch --no-title --interval 1 "curl http://example.com -o test2.html" | grep -P '\d.*\d'
ベストアンサー1
パイプバッファリングのため、カールの| grep
進行状況を直接出力できません。この問題に関するいくつかの重要な洞察は、以前の質問で提供されています。パイプラインでバッファリングをオフにする
解決策はstdbuf
次のとおりですtr
。
curl https://example.com -o example.html 2>&1 | stdbuf -oL tr -s '\r' '\n' | while read i; do echo -en "\r$i "; done
そして:
stdbuf -oL
:stdout は、ループが正しく処理されるようにラインバッファtr
リングされます。while
tr -s '\r' '\n'
curl
:出力からキャリッジリターンを改行文字に置き換えます。while read i; do echo -en "\r$i "; done
:bash
進行線のための簡単なソリューション