두 줄이 포함된 모든 파일을 찾고 싶습니다: abc
및 def
. 예를 들어,
xxx
111abc
yyy
222def333
이 파일에는 및 가 grep
포함되어 있으므로 캡처해야 합니다 .abc
def
어떻게 해야 합니까? 나는 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}
조건을 충족하는 출력 파일