Что делать, если я хочу исключить N строк после строки с «нежелательным словом»? -v 'unwanted_word' --after Nне помогает, потому что включает в себя строку и N строк после.
Андрей Регентов
-vили --invert-matchвыберите несовпадающие строки. В вашем случае grep -v 'unwanted_word' fileили grep --invert-match 'unwanted_word' file.
adamski.pro
Я хочу игнорировать одну строку выше и одну строку ниже с соответствующим шаблоном. Как я могу этого достичь?
Кандзи Виройя
Круто, я использую это в git для быстрого просмотра статуса моего репо, работает как талисман:git status -s |grep -v "folder_I_dont_care"
benjaminz
3
Странно, это лучший ответ, но в некоторых случаях это неправильно! Если я хочу найти sun, за исключением случаев, когда это так sunrise, grep sun|grep -v sunriseпропускает строку, содержащую оба sunи sunriseсразу, это не то, что я хочу. grep -P 'sun(?!rise)'намного лучше.
Грин
86
Я понял вопрос как «Как мне сопоставить слово, но исключить другое», для которого одно решение состоит из двух последовательных greps: первый grep находит искомое «word1», второй grep исключает «word2»:
grep "word1"| grep -v "word2"
В моем случае: мне нужно различать «plot» и «#plot», что не подходит для «слова» в grep («#» не является буквенно-цифровым).
Спасибо за это, очень полезно! Я хотел бы отметить, что по умолчанию команда grep чувствительна к регистру
DocWiki
2
Обратите внимание, что grep -v -Pтакже работает без отрицания в регулярном выражении.
cybersoft
«если буш ... тебе нужно сбежать !» . Спасибо Спасибо спасибо! Вот чего я хотел!
Габриэль Стейплс
36
Правильное решение заключается в использовании grep -v "word" file, с его awkэквивалентом:
awk '!/word/' file
Однако, если вам случится иметь более сложную ситуацию, в которой вы хотите, скажем, XXXпоявиться, а YYYне появиться, тогда вам awkпригодится вместо того, чтобы передать несколько greps:
awk '/XXX/ && !/YYY/' file
# ^^^^^ ^^^^^^# I want it |# I don't want it
Вы даже можете сказать что-то более сложное. Например: я хочу, чтобы эти строки содержали либо, XXXлибо YYY, но не ZZZ:
Здесь grep попытается перечислить все вхождения 'wanted_pattern' во всех файлах из текущего каталога и передать его второму grep, чтобы отфильтровать 'unwanted_pattern'. '|' - pipe сообщит оболочке подключить стандартный вывод левой программы (grep -r 'wanted_pattern' *) к стандартному вводу правой программы (grep -v 'unwanted_pattern').
Со страницы man: «-L, --files-without-match Подавить нормальный вывод; вместо этого выведите имя каждого входного файла, из которого обычно не выводился бы вывод. Сканирование остановится при первом совпадении. » (Акцент от меня) Так что остерегайтесь этого!
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Ответы:
Вы можете сделать это, используя
-v
(для--invert-match
) опцию grep как:grep -v "unwanted_word" file
будет фильтровать строки, которые имеютunwanted_word
иgrep XXXXXXXX
будет перечислять только строки с шаблономXXXXXXXX
.РЕДАКТИРОВАТЬ:
Из вашего комментария похоже, что вы хотите перечислить все строки без
unwanted_word
. В этом случае все, что вам нужно, это:источник
-v 'unwanted_word' --after N
не помогает, потому что включает в себя строку и N строк после.-v
или--invert-match
выберите несовпадающие строки. В вашем случаеgrep -v 'unwanted_word' file
илиgrep --invert-match 'unwanted_word' file
.git status -s |grep -v "folder_I_dont_care"
sun
, за исключением случаев, когда это такsunrise
,grep sun|grep -v sunrise
пропускает строку, содержащую обаsun
иsunrise
сразу, это не то, что я хочу.grep -P 'sun(?!rise)'
намного лучше.Я понял вопрос как «Как мне сопоставить слово, но исключить другое», для которого одно решение состоит из двух последовательных greps: первый grep находит искомое «word1», второй grep исключает «word2»:
В моем случае: мне нужно различать «plot» и «#plot», что не подходит для «слова» в grep («#» не является буквенно-цифровым).
Надеюсь это поможет.
источник
word1
.Если вы
grep
поддерживаете регулярное выражение Perl с-P
опцией, которую вы можете сделать (если bash; если tcsh, вам нужно будет экранировать!
):Демо-версия:
Давайте теперь перечислим все
foo
кромеfoo3
источник
grep -v -P
также работает без отрицания в регулярном выражении.!
» . Спасибо Спасибо спасибо! Вот чего я хотел!Правильное решение заключается в использовании
grep -v "word" file
, с егоawk
эквивалентом:Однако, если вам случится иметь более сложную ситуацию, в которой вы хотите, скажем,
XXX
появиться, аYYY
не появиться, тогда вамawk
пригодится вместо того, чтобы передать несколькоgrep
s:Вы даже можете сказать что-то более сложное. Например: я хочу, чтобы эти строки содержали либо,
XXX
либоYYY
, но неZZZ
:и т.п.
источник
grep -P
решение для больших файлов.grep -P
означает использование Perl regexp, поэтому загрузка этого пакета будет намного дороже обычногоgrep
.Инвертировать соответствие, используя grep -v:
источник
grep предоставляет опцию '-v' или '--invert-match' для выбора несовпадающих строк.
например
Это выведет все строки из файла file_name, который не имеет «unwanted_pattern».
Если вы ищете шаблон в нескольких файлах внутри папки, вы можете использовать опцию рекурсивного поиска следующим образом
Здесь grep попытается перечислить все вхождения 'wanted_pattern' во всех файлах из текущего каталога и передать его второму grep, чтобы отфильтровать 'unwanted_pattern'. '|' - pipe сообщит оболочке подключить стандартный вывод левой программы (grep -r 'wanted_pattern' *) к стандартному вводу правой программы (grep -v 'unwanted_pattern').
источник
-v
Вариант покажет вам все строки , которые не соответствуют шаблону.источник
У меня есть каталог с кучей файлов. Я хочу найти все файлы, которые НЕ содержат строку «ускорение», поэтому я успешно использовал следующую команду:
источник