Как я могу исключить одно слово с 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
пригодится вместо трубопроводов несколько grep
s:
awk '/XXX/ && !/YYY/' file
# ^^^^^ ^^^^^^
# I want it |
# I don't want it
вы даже можете сказать что-то более сложное. Например: я хочу, чтобы эти строки содержали либо XXX
или YYY
, но не ZZZ
:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
etc.
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 *