Jak mogę wykluczyć jedno słowo z grep?


Odpowiedzi:


801

Możesz to zrobić za pomocą opcji -v(for --invert-match) grep jako:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" fileodfiltruje linie, które mają unwanted_wordi grep XXXXXXXXwyświetli tylko linie ze wzorem XXXXXXXX.

EDYTOWAĆ:

Z twojego komentarza wygląda na to, że chcesz wymienić wszystkie linie bez unwanted_word. W takim przypadku wszystko czego potrzebujesz to:

grep -v 'unwanted_word' file

2
co jeśli chcę wykluczyć również N wierszy po wierszu z „niechcianym słowem”? -v 'unwanted_word' --after Nnie pomaga, ponieważ OBEJMUJE linię i N linii po.
Andrey Regentov,

-vlub --invert-matchwybierz niepasujące linie. W twoim przypadku grep -v 'unwanted_word' filelub grep --invert-match 'unwanted_word' file.
adamski.pro

Chcę zignorować jedną linię powyżej i jedną linię poniżej z pasującym wzorcem. Jak mogę to osiągnąć?
Kanji Viroja,

Niesamowite, używam tego w git, aby szybko sprawdzić status mojego repozytorium, działa jak urok:git status -s |grep -v "folder_I_dont_care"
benjaminz

3
Dziwne, to najlepsza odpowiedź, ale w niektórych przypadkach jest błędna! Jeśli chcę, aby znaleźć sun, z wyjątkiem gdy jest to sunrise, grep sun|grep -v sunrisepomija linię, która zawiera zarówno suni sunriseod razu, że nie jest to, co chcę. grep -P 'sun(?!rise)'jest znacznie lepszy.
greene

86

Zrozumiałem pytanie jako „Jak dopasować słowo, ale wykluczyć inne”, dla którego jednym rozwiązaniem są dwa grep w szeregu: Pierwsze grep znajdowanie poszukiwanego „słowa 1”, drugie grep z wyłączeniem „słowa 2”:

grep "word1" | grep -v "word2"

W moim przypadku: muszę rozróżnić „plot” i „#plot”, którego opcja „word” grepa nie zrobi („#” nie jest alfanumeryczny).

Mam nadzieję że to pomoże.


16
Powinieneś odwrócić kolejność, aby włączyć podświetlanie word1.
Mateusz

1
Wydaje mi się, że należy wyjaśnić dodanie symbolu zastępczego dla nazwy pliku do tego przykładu
Patrick

39

Jeśli grepwspierasz wyrażenie regularne Perla z -Popcją, możesz to zrobić (jeśli bash; jeśli tcsh będziesz musiał uciec !):

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

Próbny:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

Wymieńmy teraz wszystkie fooopróczfoo3

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

Dzięki za to, bardzo przydatne! Chciałbym wspomnieć, że polecenie grep domyślnie rozróżnia małe
duże litery

2
Zauważ, że grep -v -Pdziała również bez negacji w wyrażeniach regularnych.
cybersoft

„jeśli bash ... musisz uciec ! . Dziekuję Dziekuję Dziękuję! Właśnie tego chciałem!
Gabriel Staples,

36

Właściwym rozwiązaniem jest użycie grep -v "word" file, z jego awkodpowiednikiem:

awk '!/word/' file

Jednakże, jeśli zdarzy ci się mieć bardziej złożoną sytuację, w której chcesz, powiedzmy, XXXpojawiać się, a YYY nie pojawiać, wtedy awkprzydaje się zamiast sipowania kilku greps:

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

Możesz nawet powiedzieć coś bardziej złożonego. Na przykład: chcę te linie zawierające albo XXXalbo YYY, ale nie ZZZ:

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

itp.


2
Wydaje się być znacznie szybszy niż grep -Prozwiązanie dla dużych plików.
MBR

@ MBR grep -Poznacza użycie wyrażenia regularnego Perla, więc ładowanie tego pakietu będzie znacznie droższe niż normalnie grep.
fedorqui „SO przestań szkodzić”

10

Odwróć dopasowanie za pomocą grep -v:

grep -v "unwanted word" file pattern

6

grep zapewnia opcję „-v” lub „--invert-match”, aby wybrać niepasujące linie.

na przykład

grep -v 'unwanted_pattern' file_name

Spowoduje to wypisanie wszystkich wierszy z pliku nazwa_pliku, który nie ma „niepożądanego_zakładu”.

Jeśli przeszukujesz wzorzec w wielu plikach w folderze, możesz użyć opcji wyszukiwania rekurencyjnego w następujący sposób

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

Tutaj grep spróbuje wyświetlić wszystkie wystąpienia „Want_pattern” we wszystkich plikach z bieżącego katalogu i przekazać go do drugiego grep, aby odfiltrować „niepożądany_pattern”. „|” - pipe powie powłoce, aby połączyła standardowe wyjście lewego programu (grep -r 'Want_pattern' *) ze standardowym wejściem prawego programu (grep -v 'niepożądany_pattern').


4

-vOpcja pokaże wszystkie linie, które nie pasują do wzorca.

grep -v ^unwanted_word

-5

Mam katalog z wieloma plikami. Chcę znaleźć wszystkie pliki, które NIE zawierają ciągu „przyspieszenie”, więc z powodzeniem użyłem następującego polecenia:

grep -iL speedup *

1
Ze strony podręcznika: „-L, --files-without-match Pomiń normalne wyjście; zamiast tego wypisz nazwę każdego pliku wejściowego, z którego normalnie nie wydrukowano by żadnego wyjścia. Skanowanie zatrzyma się przy pierwszym dopasowaniu. ” (Podkreślenie przeze mnie) Więc strzeżcie się tego!
xuiqzy,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.