##을 포함하는 두 줄 사이의 오류를 일치시키는 정규식

##을 포함하는 두 줄 사이의 오류를 일치시키는 정규식

다음과 같은 로그 파일이 있습니다. .. 이 파일이 some_error_message(" "로 표시됨) some_error_message두 줄 사이에 나타나면 원격 ftp/sftp 사이트에서 오류가 발생한 것으로 가정합니다.####

some content in log file..
##
some content in log file..

some_error_message

some content in log file..
##
some content in log file..

some_error_message이제 기호가 포함된 행 과 일치하는 정규식을 작성하고 싶습니다.##

아래는 단지 예시일 뿐입니다

grep -iq "^[#][#].*some_error_message.*[#][#]$"

도와주세요! !

참고: 로그에는 4개의 # 기호만 나타납니다. 더이상. 한 줄에는 ##, 다른 줄에는 ##입니다.

답변1

이와 같은 도구는 grep한 번에 한 줄만 일치시킬 수 있으므로 grep.

sed중첩된 블록 내의 부품만 추출하고 파이핑하는 등의 도구를 사용하여 grep관심 있는 오류 메시지를 찾을 수 있습니다.

/START/,/END/pin 명령은 sed두 정규식과 일치하는 줄로 시작하고 끝나는 블록 사이의 줄만 인쇄합니다. 또한 기본적으로 어떤 줄도 인쇄하지 않도록 매개변수를 sed전달 해야 합니다.-n

그래서:

$ sed -n '/^##$/,/^##$/p' mylogfile.txt |
  grep -iq '^some_error_message$'

답변2

Perl은 이것을 쉽게 처리할 수 있습니다.범위연산자(때때로 flip-flop연산자라고도 함):

perl -nle 'if (/^##/.../^##/) {print if /some_error_message/i}' file

##이는 줄의 시작 부분에 고정되어 시작하고 끝나는 블록을 찾는 파일을 읽습니다 . 블록 내에서 토큰이 있는 모든 줄이 some_error_message인쇄됩니다. 이 예에서 "some_error_messsage"에 대한 일치는 대소문자를 구분하지 않습니다.

답변3

간단한 버전입니다 sed(일반적으로 sed출력을 파이프할 필요가 없으며 명령을 와 연결하기만 하면 됩니다 ;).

sed '/^##$/,//!d;/some_error_message/!d'

^##$먼저 (한 행)에서 빈 패턴까지의 주소 범위를 만듭니다 ##(즉, 마지막 패턴을 반복하므로 다른 행이 반복됨을 의미) ##. 일치 항목을 되돌리고 !범위 d밖의 모든 항목을 제거합니다.

둘째, ( ) 를 포함하지 않는 d모든 줄을 삭제합니다 .!some_error_message

관련 정보