grep (foo를 포함하지 않는 매치 라인)을 이용한 네거티브 매칭


990

이 명령의 구문을 해결하려고 노력했습니다.

grep ! error_log | find /home/foo/public_html/ -mmin -60

또는:

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

이름이 지정된 파일을 제외하고 수정 된 모든 파일을 확인해야합니다 error_log.

나는 그것에 대해 읽었 지만 하나의 not정규식 패턴 만 발견했습니다 .


13
[^ error_log]는 결코 어쨌든 작동하지 않을 것입니다. []는 char 클래스입니다. regexp는 일반적으로 부정적인 패턴에 좋지 않습니다 (엔진이 부정적인 예측을 구현하지 않는 한).
Jaap

답변:


1755

grep -v 당신의 친구입니다:

grep --help | grep invert  

-v, --invert-match 일치하지 않는 행을 선택합니다

또한 관련 항목 -L()을 확인하십시오 -l.

일치하지 않는 -L, --files- 만 일치하지 않는 파일 이름 만 인쇄


124
여러 (음수) 경기 -e옵션을 사용할 수 있다고 언급 할 가치 가 있습니다.grep -v -e 'negphrase1' -e 'negphrase2'
Babken Vardanyan

31
@ Babken-Vardanyan의 의견과 유사 – 파이프를 사용하여 여러 경기를 합칠 수 있습니다.grep -v 'negphrase1|negphrase2|negphrase3'
Nicholas Adams

13
마지막 코멘트는 둘 다가 아닌 둘 다 일치하지 않는 것을 검색하는 것과 다릅니다. 즉, 일치하지만 다른 것과 일치하지 않으면 여전히 인쇄됩니다. 그것을 비 유사한 문자열 두 가지를 시도
에반 랑 그르에게

7
@EvanLanglois-grep이 -E작품을 사용하여 패턴을 확장 된 정규 표현식으로 해석하도록 강요 합니다. grep -vE 'negphrase1|negphrase2|negphrase3'
Zlemini

1
OlleHärstedt @, 나는 내 이전의 코멘트에있는 당신의 시나리오를 오해 생각, 다음은 당신이 찾고있는 무엇을 할 수있다 grep "" /dev/null * | grep foo | grep -v bar | cut -d: -f1 | sort -u( ? 처음 그렙 왜 :) 항상 방법이)
은 Motti

139

awk보다 복잡한 방식으로보다 명확한 검사를 수행 할 수 있으므로 다음과 같은 목적으로 도 사용할 수 있습니다 .

포함하지 않는 줄 foo:

awk '!/foo/'

어느 쪽도 포함하지 않는 라인 foobar:

awk '!/foo/ && !/bar/'

어느 쪽도 포함하지 않는 라인 foobar하나 포함 foo2또는 bar2:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

등등.


2
실제로 아주 멋지다. 정규 표현식을 논리 연산자로 그룹화하기 위해 완전한 awk 언어를 배울 필요조차 없습니다. 이 답변에 감사드립니다!
Peter T.

1
내가 찾던 것, 정말 고마워.
mmrs151

13

귀하의 경우에는 아마도 grep을 사용하고 싶지 않지만 대신 find 명령에 부정적인 조항을 추가하십시오.

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

이름에 와일드 카드를 포함 시키려면 접미사가 .log 인 파일을 제외 시키려면 와일드 카드를 이스케이프 처리해야합니다.

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.