grep cURL 출력

grep cURL 출력

내가 달릴 때

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를 사용해 보았지만 여전히 작동하지 않습니다(출력 없음).

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진행선을 위한 간단한 솔루션

관련 정보