문자열 값이 0보다 크면 이전 줄을 Grep합니다.

문자열 값이 0보다 크면 이전 줄을 Grep합니다.

안녕하세요. 다음 정보가 포함된 텍스트 파일이 있습니다.

#[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인 경우 --EndReturn과 행을 가져오고 싶습니다 . 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변수를 pr1(true)로 설정한 후 다음 줄로 이동합니다.

  • pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}: prtrue인 경우 원하는 형식으로 출력을 인쇄하고 최종적으로 pr0(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으로 시작하지 않는) 모든 (양수) 숫자를 캡처해야 합니다.

관련 정보