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