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

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

grep ^"unwanted_word"XXXXXXXX

Ответ 1

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

grep -v "unwanted_word" file | grep XXXXXXXX

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

РЕДАКТИРОВАТЬ:

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

grep -v 'unwanted_word' file

Ответ 2

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

grep "word1" | grep -v "word2"

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

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

Ответ 3

Если ваш 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
$ 

Ответ 4

Правильное решение - использовать 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

и др.

Ответ 5

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

grep -v "unwanted word" file pattern

Ответ 6

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

grep -v ^unwanted_word

Ответ 7

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').

Ответ 8

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

grep -iL speedup *