여러 줄을 grep하는 방법

여러 줄을 grep하는 방법

두 줄이 포함된 모든 파일을 찾고 싶습니다: abcdef. 예를 들어,

xxx
111abc
yyy
222def333

이 파일에는 및 가 grep포함되어 있으므로 캡처해야 합니다 .abcdef

어떻게 해야 합니까? 나는 grep -rE 'abc.*def' /dir/성공하지 않고 이것을 시도했습니다.

답변1

grep보다 단순화된 패턴 () --null-data버전은 -z다음과 같이 욕심 많은 수량자를 사용하여 원하는 수의 새 줄을 일치시키는 것입니다.

grep -ozP  'abc(.*\n.*){1,}def' file

또는 pcregrep을 사용하십시오(제공:PCRE 프로젝트)는 기본적으로 PCRE 정규식 기능을 사용합니다. -M여러 줄 일치 모드를 활성화합니다 .

pcregrep -M 'abc(.*\n.*){1,}def' file

답변2

GNU 시스템에서는 일치 항목의 상대적 순서가 중요하지 않은 경우 두 모드 모두에서 작업을 수행합니다.

grep -rlZ abc /dir/ | xargs -r0 grep -l def

패턴이 2개 이상인 경우 패턴을 연결할 수 있습니다.

grep -rlZ abc /dir/ | xargs -r0 grep -lZ def | xargs -r0 grep -l xxx

또는 다음을 사용하십시오 find.

find /dir/ -type f -exec grep -q abc {} \; -exec grep -q def {} \; -print

grep이는 그다지 효율적이지 않으며 작업에 더 적합한 다른 도구가 있습니다 .

답변3

더 복잡한 조건이 있는 경우 Awk를 사용할 수 있습니다.

awk 'BEGIN{RS="\0"} 
     /def/ && /abc/ {print FILENAME}' *

어디:

  • RS="\0"정의 파일(=slurp 파일)에 존재하지 않는 구분 기호를 등록하고
  • condition {print FILENAME}조건을 충족하는 출력 파일

관련 정보