grep을 사용하여 여러 줄에서 패턴 일치를 찾는 방법
grep
파일 및 기타 유형의 입력에서 패턴과 문자열을 찾을 수 있는 명령줄 텍스트 검색 유틸리티입니다. 대부분의 일치 항목은 한 줄에만 일치하지만 여러 줄 바꿈을 일치시키는 데 유용한 경우가 많습니다.
grep으로 여러 줄 바꿈 일치
여러 줄 일치를 처리하는 것은 grep
그들이 고군분투하는 것입니다. 이 작업에 가장 적합한 도구는 여러 줄 입력을 자연스럽게 처리하는 awk
또는 입니다. sed
사이에 쉼표가 있는 두 표현식을 사용하면 두 패턴 사이의 모든 것과 일치합니다.
awk '/from/,/to/' file
sed -n '/from/,/to/p' file
에서 여전히 이 작업을 수행할 수 grep
있지만 명령이 매우 서투릅니다.
grep -Pz '(?s)from.*n.*to' test
이것은 여러 가지 작업을 수행합니다.
-P
Perl 호환 정규식을 포함 합니다 .-z
전체 파일을 줄 바꿈 대신 “null 바이트”가 포함된 단일 문자열로 전달합니다. 이를 통해 grep은 모든 것을 한 줄로 처리할 수 있습니다.(?s)
PCRE_DOTALL을 켜서.
문자가 개행을 포함한 모든 문자와 일치하도록 합니다.from
시작 경기..*n.*
to
은 (는) 최종 일치인 까지 모든 항목과 일치합니다.
일반적으로 이것은 스크립팅 목적으로 수행되지만 직접 입력하는 경우 기억해야 할 사항이 많습니다. 또한 -o
플래그를 사용하여 일치 항목만 인쇄하면 종료 널 바이트도 인쇄되므로 추가 문제가 발생할 수 있습니다.
대신 pcre2grep 사용(Perl 호환 grep)
Regular grep
는 작업에 가장 적합한 도구가 아니며 pcre2grep
Perl 호환 정규식에 대한 지원을 즉시 포함하고 여러 줄 정규식과 매우 쉽게 일치할 수 있는 이라는 대안이 있습니다.
시스템에 설치되어 있을 수 있지만 그렇지 않은 경우 패키지 관리자에서 얻을 수 있습니다.
sudo apt install pcre2-utils
그런 다음 매개 변수와 함께 실행하기만 하면 -M
됩니다.
pcre2grep -M 'from(n|.)*to' file
이렇게 하려면 “개행 또는 임의의 문자”를 수동으로 일치시켜야 합니다 (n|.)*
. 또는 (?s)
트릭을 사용하여 PCRE_DOTALL을 활성화하고 점 문자가 개행 문자와 일치하도록 할 수 있습니다.
pcre2grep -M '(?s)from.*to' file
답글 남기기