カール出力からダウンロード進行状況を抽出する

カール出力からダウンロード進行状況を抽出する

検索中のファイルのダウンロードの進行状況を抽出しようとしています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%

誰もが私が間違っていることを指摘できますか?

ベストアンサー1

主な質問はsed次に適用されることです。ワイヤーしたがって、最初のコマンドに到達するまで何も実行せず、\nコマンドが完了するまで何も起こりません。\rsをsに置き換えることでこの問題を解決できます\n

$ 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

おすすめ記事