Extrai o progresso do download da saída de curl

3

Estou tentando extrair o progresso do download de um arquivo que está sendo recuperado por curl .

Eu tentei isso, mas isso não funciona:

curl --progress-bar http://127.0.0.1/test.tar.bz2 -o test.tar.bz2 2>/dev/stdout | sed -r 's/[# ]//g;s/^/#/g'

A expressão sed parece estar bem:

$ echo '########                      10.2%' | sed -r 's/[# ]//g;s/^/#/g'
#10.2%

Alguém por favor pode apontar o que estou fazendo errado?

    
por user2064000 30.06.2014 / 18:18

1 resposta

3

A questão principal é que sed funciona em linhas para que não faça nada até que o primeiro \n seja alcançado e isso não aconteça até que seu comando seja concluído. Você pode contornar isso trocando \r s por \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;'

Isso, no entanto, mostra o buffer, sed agora atuará em grupos de linhas. A solução final que eu juntei foi redirecionar o erro para um arquivo e então lidar com esse arquivo:

$ 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

O comando acima analisará o arquivo de erro ( er ) e imprimirá o resultado com um \r , atualizando-o constantemente. Você precisará sair disso manualmente.

Sugestão de um usuário anônimo: Você também pode colocar stdbuf -oL na frente de tr e sed , modificando o comportamento do buffer desses comandos.

    
por 30.06.2014 / 19:08

Tags