내가 달릴 때
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
진행선을 위한 간단한 솔루션