
안녕하세요. 다음 정보가 포함된 텍스트 파일이 있습니다.
#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55
#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32
해당 Return이 0인 경우 --End
행 Return
과 행을 가져오고 싶습니다 . Elapsed
>
지금까지는 Return 라인만 grep할 수 있습니다.grep "#RETURN:" -A 1 -B 1 f.log
>
하지만 Return이 0일 때만 grep하는 방법은 무엇입니까?
원하는 출력:
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55
답변1
그리고 awk
:
awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next};\
pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
/END$/ {prev=$0; next}
: 줄이 로 끝나면END
변수로 저장prev
하고 이전 줄인 다음 줄로 이동합니다.RETURN
/^#RETURN/ && $2>0 {cur=$0; pr=1; next}
: 줄이 로 시작#RETURN
하고 두 번째 필드가 0보다 큰 경우 줄을 로 저장하고cur
변수를pr
1(true)로 설정한 후 다음 줄로 이동합니다.pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}
:pr
true인 경우 원하는 형식으로 출력을 인쇄하고 최종적으로pr
0(false)으로 설정합니다.
예:
% cat file.txt
#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55
#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32
% awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55
답변2
이것을 시도해 볼 수 있습니다.
awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test
예를 들어;
user@host:/tmp$ awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test
#ELAPSED TIME (in seconds): 55
답변3
다음 내용을 포함해야 합니다 grep
.
grep -C1 'RETURN: [1-9][0-9]*' input.txt
이 정규식은 단일 0이 아닌(또는 0으로 시작하지 않는) 모든 (양수) 숫자를 캡처해야 합니다.