나는 종종 awk를 사용하여 로그를 구문 분석합니다. 나는 이와 같은 것을 본 적이 없습니다. "100"을 포함하는 파일이 6개 있고 인쇄할 열을 선택합니다.
me:~/tmp> grep 100 *.dl.tst
내가 기대하는 것을 출력합니다:
100 139M 100 139M 0 0 6376k 0 0:00:22 0:00:22 --:--:-- 6539k
100 139M 100 139M 0 0 6677k 0 0:00:21 0:00:21 --:--:-- 6579k
100 139M 100 139M 0 0 6022k 0 0:00:23 0:00:23 --:--:-- 6093k
100 139M 100 139M 0 0 13.9M 0 0:00:10 0:00:10 --:--:-- 14.3M
100 139M 100 139M 0 0 14.3M 0 0:00:09 0:00:09 --:--:-- 14.7M
100 139M 100 139M 0 0 13.2M 0 0:00:10 0:00:10 --:--:-- 13.3M
다음과 같이:
me:~/tmp> grep 100 *.dl.tst|awk '{print$0}'
100 139M 100 139M 0 0 6376k 0 0:00:22 0:00:22 --:--:-- 6539k
100 139M 100 139M 0 0 6677k 0 0:00:21 0:00:21 --:--:-- 6579k
100 139M 100 139M 0 0 6022k 0 0:00:23 0:00:23 --:--:-- 6093k
100 139M 100 139M 0 0 13.9M 0 0:00:10 0:00:10 --:--:-- 14.3M
100 139M 100 139M 0 0 14.3M 0 0:00:09 0:00:09 --:--:-- 14.7M
100 139M 100 139M 0 0 13.2M 0 0:00:10 0:00:10 --:--:-- 13.3M
그렇다면 $1
파일 이름이 되는 이유는 다음과 같습니다.
me:~/tmp> grep 100 *.dl.tst|awk '{print$1}'
shpr002.20201124_141036.dl.tst:
shpr003.20201124_141036.dl.tst:
shpr004.20201124_141036.dl.tst:
hipr002.20201124_141036.dl.tst:
hipr003.20201124_141036.dl.tst:
hipr004.20201124_141036.dl.tst:
그리고 $2
:
me:~/tmp> grep 100 *.dl.tst|awk '{print$2}'
0
0
0
0
0
0
내 쉘(bash)이 엉망이 될 경우를 대비해 로그아웃했다가 다시 로그인했습니다. 변경 사항이 없습니다. 내가 뭘 잘못하고 있는 걸까요?
출력 grep 100 *.dl.tst | awk '{print$1}' | head -n1 | od -c
(일부 알파벳 문자가 대체되었습니다 x
. 위 목록은 편집/난독화되었습니다.)
0000000 x s h p r 0 0 2 x x x . x x x .
0000020 x x x x . c o m . 2 0 2 0 - 1 1
0000040 - 2 4 _ 1 4 1 0 3 6 . d l . t s
0000060 t : \r \n
0000064
답변1
이러한 파일에는 다운로드한 파일의 출력이 포함되어 있으며 curl
다운로드 curl
중에 캐리지 리턴 문자(대부분 \r
의 경우 캐리지 리턴을 생성하는 데 사용되는 이스케이프 문자로 표시됨)를 출력하여 진행 정보를 업데이트합니다. 시작 부분을 파일로 저장하세요. 철사.
를 실행하면 grep 100 *.dl.tst
출력의 각 줄이 파일 이름으로 시작하지만 여러 업데이트로 인해 커서가 줄의 시작 부분으로 돌아가므로 파일 이름이 표시되지 않습니다. 후속 출력이 파일 이름을 덮어쓰게 됩니다. 더 자세히 보면 출력은 다음과 같습니다.
shpr002.20201124_141036.dl.tst:
캐리지 리턴이 뒤따르고 첫 번째 진행 출력이 뒤따릅니다 curl
.
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
그런 다음 백분율이 100에 도달할 때까지 캐리지 리턴 등을 수행합니다. 이 모든 것은 줄 바꿈이 아닌 캐리지 리턴으로만 구분되므로 한 줄로 계산되어 grep
전체 줄과 일치합니다.
동일한 효과가 의 출력을 설명합니다 grep 100 *.dl.tst|awk '{print$0}'
.
AWK에 출력을 요청하면 $1
첫 번째 필드가 출력되고 이제 볼 수 있습니다. 여기에는 파일 이름, 콜론, 캐리지 리턴이 포함되어 있습니다. curl
출력의 시작 부분과 공백(백분율 계산을 위해 생략됨) 공백)은 필드 구분 기호입니다. 출력을 요청하면 $2
두 번째 필드인 첫 번째 백분율 카운트가 출력됩니다 0
.
shpr002.20201124_141036.dl.tst:\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
<-- Field 1 --> ! ! ! ! ...
$2 $3 $4 $5 ...
답변2
전용문제에 대한 스티븐의 설명출력을 더 다루기 쉽게 만드는 간단한 방법은 모든 캐리지 리턴을 줄 바꿈으로 변환하고 컬의 진행 상황 보고를 별도의 줄로 남겨 두는 것입니다. 그런 다음 다음 용도로 사용할 수 있습니다 awk
.
$ for f in *.dl; do < "$f" tr '\r' '\n' | awk '$1 == "100" {print $0}' ; done
100 720k 100 720k 0 0 22.5M 0 --:--:-- --:--:-- --:--:-- 22.7M
100 23.6M 100 23.6M 0 0 372M 0 --:--:-- --:--:-- --:--:-- 369M
(그러나 컬이 인쇄하는 백분율을 반올림하는 대신 가장 가까운 정수로 반올림하면 큰 파일 100
의 첫 번째 열에 여러 줄이 표시 될 수 있습니다.)
반면에 파일에 컬의 출력만 포함되어 있다는 것을 알고 있다면 내용을 보는 대신 마지막 줄만 선택하는 것이 좋습니다.
$ for f in *.dl; do < "$f" tr '\r' '\n' | tail -n1 ; done
100 720k 100 720k 0 0 22.5M 0 --:--:-- --:--:-- --:--:-- 22.7M
100 23.6M 100 23.6M 0 0 372M 0 --:--:-- --:--:-- --:--:-- 369M