awk $1이 무엇인지 혼란스러워 보이는군요

awk $1이 무엇인지 혼란스러워 보이는군요

나는 종종 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

관련 정보