다음과 같은 로그 파일이 있습니다. .. 이 파일이 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/p
in 명령은 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