saída grep cURL

0

Quando eu corro

curl https://example.com -o example.html 2>&1 | grep -P "\d.*\d"

Eu recebo esta saída (em vermelho):

100  1270  100  1270    0     0    318      0  0:00:04  0:00:04 0:00:00   318


O que eu quero é apenas mostrar a última linha da barra de progresso do cURL conforme atualiza (na verdade, quero apenas que certas colunas sejam mostradas, mas mostrando que a linha inteira está bem)


Saída desejada (no tempo t = 1 seg):

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

Saída desejada (no tempo t = 2 seg):

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

Saída desejada (no momento t = 3 seg):

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

Saída desejada (no tempo t = 4 seg):

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

Eu tentei usar o watch com cURL e grep, mas ainda não funciona (sem saída)

watch --no-title --interval 1 "curl http://example.com -o test2.html" | grep -P '\d.*\d'
    
por AvdnhracNTAd9ex 24.08.2017 / 02:26

1 resposta

0

Você não pode diretamente | grep a saída do progresso de curvatura devido ao buffer de tubulação. Algumas excelentes informações sobre esse problema estão disponíveis nesta pergunta anterior: Desativar o buffer no canal

Quanto a uma solução, use stdbuf e 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

Com:

  • stdbuf -oL : stdout de tr será armazenado em buffer de linha para processamento adequado pelo while loop
  • tr -s '\r' '\n' : substitua o retorno de carro pela nova linha de curl output
  • while read i; do echo -en "\r$i "; done : simples bash solução para uma linha de progresso
por 24.08.2017 / 10:41