다음 입력 파일 input.txt
스크립트가 있습니다.
아래 출력을 생성합니다. 누군가이 awk
스크립트가 어떻게 작동하는지 시간을내어 분석해 주시겠습니까? 나는 그것에 대해 약간의 시간을 보냈고 그다지 의미가 없습니다.
입력 :
$ cat input.txt
FINISHED RSYNCJOBNA 20140502 0021 2182096 2082096 6 5 2014820905820902 10:02:15 2014820905820902 10:56:42 0:54:27 INITIATED RSYNCJOBNA 20140502 0022 3282096 3182096 6 5 2014820905820902 15:31:06 0:06:04 ce eque**
출력 :
RSYNCJOBNA|0021|20140502|10:02:15|10:56:42|0:54:27|FINISHED RSYNCJOBNA|0022|20140502|15:31:06| |0:06:04|INITIATED
위 출력을 가져 오는 명령 :
awk -v OFS="|" "/FINISHED|INITIATED/ { status = $1; getline; jobname = $1; getline; sequence = $2; date = $1; getline; start = $2; getline; if (status == "FINISHED") { end = $2; getline } else { end = " " } runtime = $1; print jobname, sequence, date, start, end, runtime, status; }" input.txt
내 이해는 /FINISHED|INITIATED/ {}
는 중괄호 안의 명령이 FINISHED
또는 INITIATED
와 일치하는 행에서만 실행됨을 의미합니다. 출력에서 알 수있는 한 스크립트는 모든 줄에서 구문 분석하는 것 같습니다. 무슨 일이에요?
댓글
Answer
getline
함수는 다음 줄을 읽고 스크립트를이 줄로 이동합니다. 연속적인 getline
호출이 다음 줄로 이동합니다. 예를 들어 보면 이해하기 더 쉬울 것입니다.
$ cat input.txt foo 1 2 $ awk "/foo/{print; getline; print; getline; print}" input.txt foo 1 2
As 위에서 볼 수 있듯이 스크립트는 foo
와 일치하기 때문에 첫 번째 줄을 처리합니다. getline
에 대한 각 호출은 현재 행 뒤의 행을 읽으므로 후속 print
호출은 다음 행을 인쇄합니다.
답변
awk
함수가하는 일이 무엇인지 모르는 경우 일반적인 전략은 다음과 같습니다. man 페이지를 보려면 :
getline
다음 입력 레코드에서 $ 0 설정; NF, NR, FNR 설정, RT
명령 블록은 실제로 두 번만 실행됩니다. 다른 줄은 내부에서 getline
를 통해 처리됩니다. 블록.
다음으로 다시 작성할 수 있습니다.
/FINISHED|INITIATED/ { status = $1; line_number=0; next; } { line_number++; } line_number==1 { jobname = $1; } line_number==2 { sequence = $2; date = $1; } ...
댓글
- 다음 레코드가 비어 있으면 어떻게됩니까?
- @AvinashRaj 귀하의 코드 나 대안 모두 줄의 내용을 보지 않습니다 (
/FINISHED|INITIATED/
제외) ). 줄은 카운트 다운됩니다. 데이터는 정확히 정렬되어야합니다 (awk parsi ng 관점) 그렇지 않으면 코드가 깨집니다.
/FINISHED|INITIATED/
와 같은 패턴을 제공하면 awk는 해당 줄을 검색하고 해당 특정 줄에서만 작업을 수행합니다. 하지만 작업은 모든 라인에서 수행되었습니다. 어떻게?