grep으로 한 단어를 어떻게 제외시킬 수 있습니까?


답변:


802

grep의 -v(for --invert-match) 옵션을 다음과 같이 사용할 수 있습니다 .

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" file이 라인 필터링합니다 unwanted_wordgrep XXXXXXXX패턴 만 라인을 나열됩니다 XXXXXXXX.

편집하다:

귀하의 의견에서을 제외한 모든 줄을 나열하려는 것처럼 보입니다 unwanted_word. 이 경우 필요한 것은 다음과 같습니다.

grep -v 'unwanted_word' file

2
"원치 않는 단어"가있는 줄 다음에 N 줄을 제외하려면 어떻게해야합니까? -v 'unwanted_word' --after N라인과 N 라인을 포함하기 때문에 도움이되지 않습니다.
Andrey Regentov

-v또는 --invert-match일치하지 않는 줄을 선택하십시오. 귀하의 경우 grep -v 'unwanted_word' file또는 grep --invert-match 'unwanted_word' file.
adamski.pro

일치하는 패턴으로 위의 한 줄과 아래의 한 줄을 무시하고 싶습니다. 어떻게 달성 할 수 있습니까?
Kanji Viroja

굉장히, 나는 이것을 git에서 사용하여 나의 repo의 상태를 빠르게 이해하고, 매력처럼 작동한다 :git status -s |grep -v "folder_I_dont_care"
benjaminz

3
이상하게도 정답이지만, 경우에 따라 틀립니다! 내가 찾으려면 sun이 경우를 제외하고 sunrise, grep sun|grep -v sunrise모두 포함 라인을 생략 sun하고 sunrise내가 원하지 않는 것입니다, 한 번에 있습니다. grep -P 'sun(?!rise)'훨씬 낫다.
greene

86

질문은 "단어를 어떻게 일치 시키지만 다른 단어를 제외 시키는가?"라는 질문을 이해했습니다. 한 솔루션은 두 개의 greps입니다. 첫 번째 grep은 원하는 "word1"을 찾고 두 번째 grep은 "word2"를 제외합니다.

grep "word1" | grep -v "word2"

필자의 경우 : grep의 "word"옵션이 수행하지 않는 "plot"과 "#plot"을 구별해야합니다 ( "#"는 영숫자가 아님).

도움이 되었기를 바랍니다.


16
강조 표시하려면 순서를 반대로해야합니다 word1.
Matthew 읽기

1
파일 이름에 대한 자리 표시자를 해당 예제에 추가하는 것이 분명하다고 생각합니다.
patrick

39

귀하의 경우 grep지원이와 정규 표현식있는 Perl -P옵션 당신은 (만약 bash는, 당신은 탈출해야합니다 tcsh의 경우 할 수 있습니다 !)

grep -P '(?!.*unwanted_word)keyword' file

데모:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

이제 foo제외하고 모두 나열하겠습니다foo3

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$ 

이것에 매우 감사합니다! 나는 그렙 명령의 경우는 기본적으로 민감하다는 것을 언급하고 싶습니다
DocWiki

2
참고 grep -v -P또한 정규 표현식에서 부정없이 작동합니다.
cybersoft

"bash는 경우 ... 당신은 탈출해야합니다 !" . 감사합니다 감사합니다 감사합니다! 그것이 내가 원하는 것입니다!
Gabriel Staples

36

올바른 솔루션은 다음 grep -v "word" fileawk동등한를 사용 하는 것입니다.

awk '!/word/' file

당신이, 당신이 말하는,하고자하는 더 복잡한 상황이 일어날 경우, XXX표시하고 YYY 있지 표시, 다음 awk대신 여러 배관의 편리한 온다 grep들 :

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

더 복잡한 것을 말할 수도 있습니다. 예를 들면 : 나는 그 라인 중 하나를 포함 할 XXX또는 YYY아니지만 ZZZ:

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

기타


2
grep -P큰 파일 의 솔루션 보다 훨씬 빠릅니다 .
MBR

@MBR grep -P은 Perl regexp를 사용한다는 것을 의미하므로 해당 패키지를로드하는 것이 일반보다 비쌉니다 grep.
fedorqui 'SO 중지 피해'

10

grep -v를 사용하여 일치 반전 :

grep -v "unwanted word" file pattern

6

grep은 '-v'또는 '--invert-match'옵션을 제공하여 일치하지 않는 행을 선택합니다.

예 :

grep -v 'unwanted_pattern' file_name

'unwanted_pattern'이없는 file_name 파일의 모든 행을 출력합니다.

폴더 내의 여러 파일에서 패턴을 검색하는 경우 다음과 같이 재귀 검색 옵션을 사용할 수 있습니다

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

여기서 grep은 현재 디렉토리 내의 모든 파일에서 발생하는 'wanted_pattern'을 모두 나열하고 두 번째 grep으로 전달하여 'unwanted_pattern'을 필터링합니다. '|' -파이프는 쉘에게 왼쪽 프로그램의 표준 출력 (grep -r 'wanted_pattern'*)을 오른쪽 프로그램의 표준 입력 (grep -v 'unwanted_pattern')에 연결하도록 지시합니다.


4

-v옵션은 패턴과 일치하지 않는 모든 선을 표시합니다.

grep -v ^unwanted_word

-5

파일이 많은 디렉토리가 있습니다. 문자열 "speedup"을 포함하지 않는 모든 파일을 찾으려면 다음 명령을 성공적으로 사용했습니다.

grep -iL speedup *

1
맨 페이지에서 : "-L, --files-without-match 일반 출력을 억제하십시오. 대신 출력이 정상적으로 인쇄되지 않은 각 입력 파일의 이름을 인쇄하십시오. 첫 번째 일치에서 스캔이 중지됩니다. "(Emphasis 나에 의해) 그래서 이것을 조심하십시오!
xuiqzy 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.