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

274

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

grep ^"unwanted_word"XXXXXXXX
  • 0
    grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Теги:
string
grep
search

8 ответов

437
Лучший ответ

Вы также можете сделать это, используя параметр -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
  • 2
    Что если я хочу исключить N строк после строки с «нежелательным словом»? -v 'unwanted_word' --after N не помогает, потому что включает в себя строку и N строк после.
  • 0
    -v или --invert-match выбрать несовпадающие строки. В вашем случае файл grep -v 'unwanted_word' file или grep -v 'unwanted_word' file grep --invert-match 'unwanted_word' file .
Показать ещё 5 комментариев
52

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

grep "word1" | grep -v "word2"

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

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

  • 13
    Вы должны изменить порядок, чтобы получить подсветку на word1 .
  • 0
    Я думаю, что было бы уточнить, чтобы добавить заполнитель для имени файла в этом примере
24

Если ваш 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
$ 
  • 0
    Спасибо за это, очень полезно! Я хотел бы отметить, что по умолчанию команда grep чувствительна к регистру
  • 0
    Ах, это здорово! Долгое время был начеку.
Показать ещё 1 комментарий
17

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

и др.

  • 2
    Похоже, это намного быстрее, чем решение grep -P для больших файлов.
  • 0
    @MBR grep -P означает использование Perl regexp, поэтому загрузка этого пакета будет намного дороже, чем обычного grep .
9

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

grep -v "unwanted word" file pattern
3

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

3

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

grep -v ^unwanted_word
0

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

grep -iL speedup *
  • 1
    Со страницы man: «-L, --files-without-match Подавить нормальный вывод; вместо этого выведите имя каждого входного файла, из которого обычно не выводился бы вывод. Сканирование остановится при первом совпадении. » (Акцент от меня) Так что остерегайтесь этого!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню