Как я могу исключить одно слово с помощью grep? - PullRequest
407 голосов
/ 27 декабря 2010

Мне нужно что-то вроде:

grep ^"unwanted_word"XXXXXXXX

Ответы [ 8 ]

699 голосов
/ 27 декабря 2010

Вы также можете сделать это, используя -v (для --invert-match) параметр grep как:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" file отфильтрует строки с unwanted_word, а grep XXXXXXXX отобразит только строки с шаблоном XXXXXXXX.

EDIT:

Из вашего комментария похоже, что вы хотите перечислить все строки без unwanted_word. В этом случае все, что вам нужно, это:

grep -v 'unwanted_word' file
76 голосов
/ 21 ноября 2012

Я понял вопрос как «Как мне сопоставить слово, но исключить другое», для которого одно решение состоит из двух последовательных greps: первый grep находит искомое «word1», второй grep исключает «word2»:

grep "word1" | grep -v "word2"

В моем случае: мне нужно различать «plot» и «#plot», что не подходит для «слова» в grep («#» не является буквенно-цифровым).

Надеюсь, этопомогает.

32 голосов
/ 27 декабря 2010

Если ваш 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
$ 
29 голосов
/ 10 апреля 2015

Правильное решение - использовать grep -v "word" file, с awk эквивалентом:

awk '!/word/' file

Однако, если у вас возникла более сложная ситуация, в которой вы хотите, скажем, появиться XXX, а YYY , а не , тогда awk пригодится вместо нескольких grep s

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

Вы даже можете сказать что-то более сложное. Например: я хочу, чтобы эти строки содержали XXX или YYY, но не ZZZ:

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

и т.д.

10 голосов
/ 27 декабря 2010

Инвертировать соответствие, используя grep -v:

grep -v "unwanted word" file pattern
4 голосов
/ 27 марта 2015

grep предоставляет опцию '-v' или '--invert-match' для выбора несовпадающих строк.

например

grep -v 'unwanted_pattern' file_name

Это выведет все строки из файла имя_файла, который не имеет «unwanted_pattern».

Если вы ищете шаблон в нескольких файлах в папке, вы можете использовать опцию рекурсивного поиска следующим образом

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

Здесь grep попытаетсяперечислить все вхождения 'wanted_pattern' во всех файлах из текущего каталога и передать его второму grep, чтобы отфильтровать 'unwanted_pattern'.'|'- pipe сообщит оболочке подключить стандартный вывод левой программы (grep -r 'wanted_pattern' *) к стандартному вводу правой программы (grep -v 'unwanted_pattern').

4 голосов
/ 27 декабря 2010

Опция -v покажет вам все линии, которые не соответствуют шаблону.

grep -v ^unwanted_word
0 голосов
/ 08 октября 2015

У меня есть каталог с кучей файлов. Я хочу найти все файлы, которые НЕ содержат строку «ускорение», поэтому я успешно использовал следующую команду:

grep -iL speedup *
...