검색 중인 파일의 다운로드 진행 상황을 추출하려고 합니다 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
명령이 완료될 때까지 아무 일도 일어나지 않습니다. \r
s 를 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
선행 하여 해당 명령의 버퍼링 동작을 수정할 수도 있습니다.tr
sed
답변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으로 구분되도록 정렬합니다.