Как я могу исключить одно слово с grep?

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

grep ^"unwanted_word"XXXXXXXX

8 ответов


вы также можете сделать это с помощью -v опция grep as:

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

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

grep "word1" | grep -v "word2"

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

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


если 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
$ 

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

awk '!/word/' file

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

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

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

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

etc.


инвертировать матч с помощью grep-v:

grep -v "unwanted word" file pattern

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

grep -v ^unwanted_word

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

например

grep -v 'unwanted_pattern' file_name

это выведет все строки из файла file_name, который не имеет 'unwanted_pattern'.

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

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

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


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

grep -iL speedup *