컬 출력에서 ​​다운로드 진행 상황 추출

컬 출력에서 ​​다운로드 진행 상황 추출

검색 중인 파일의 다운로드 진행 상황을 추출하려고 합니다 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

답변2

펄을 사용해 보세요:

curl --progress-bar http://127.0.0.1/test.tar.bz2 -o test.tar.bz2 2>&1 | perl -015 -n -e 'print "$1\n" if (/[#]* ([\d]+)/);'

어디:

  • 2>&1 stdout이 있는 곳에 stderr를 할당합니다. 이 경우에는 perl에 대한 파이프입니다.
  • -015 입력 레코드 구분 기호를 캐리지 리턴 문자(8진수 15)로 설정합니다.
  • -e는 이 경우 선행 #을 건너뛰고 다음 정수를 $1로 추출하여 추출이 성공할 때마다 $1을 인쇄하는 코드 줄입니다.
  • -n은 "while(<>){}"에서 -e가 제공한 줄을 래핑하고 EOF까지 레코드별로 입력 레코드를 읽습니다. 여기서 각 레코드는 CR과 -0으로 구분되도록 정렬합니다.

관련 정보