
안녕하세요. 다음 정보가 포함된 텍스트 파일이 있습니다.
#[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으로 시작하지 않는) 모든 (양수) 숫자를 포착해야 합니다.