Мне нужно что-то вроде:
grep ^"unwanted_word"XXXXXXXX
Вы также можете сделать это, используя параметр -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
-v 'unwanted_word' --after N
не помогает, потому что включает в себя строку и N строк после.
-v
или --invert-match
выбрать несовпадающие строки. В вашем случае файл grep -v 'unwanted_word' file
или grep -v 'unwanted_word' file
grep --invert-match 'unwanted_word' file
.
Я понял вопрос как "Как совместить слово, но исключаю другое", для которого одно решение состоит из двух последовательностей greps: Первый grep находит нужное слово "word1", второе grep, исключая "word2":
grep "word1" | grep -v "word2"
В моем случае: мне нужно различать "plot" и "#plot", которые grep "word" не будет делать ( "#" не является буквенно-цифровым).
Надеюсь, что это поможет.
word1
.
Если ваш 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
и др.
grep -P
для больших файлов.
grep -P
означает использование Perl regexp, поэтому загрузка этого пакета будет намного дороже, чем обычного grep
.
Инвертировать совпадение с помощью grep -v:
grep -v "unwanted word" file pattern
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').
Параметр -v
покажет вам все строки, которые не соответствуют шаблону.
grep -v ^unwanted_word
У меня есть каталог с кучей файлов. Я хочу найти все файлы, которые НЕ содержат строку "speedup", поэтому я успешно использовал следующую команду:
grep -iL speedup *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"