Як я можу виключити одне слово з грепом?


Відповіді:


802

Ви можете зробити це, використовуючи -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

2
що робити, якщо я хочу виключити і N рядків після рядка із "небажаним словом"? -v 'unwanted_word' --after Nне допомагає, оскільки вона Включає рядок та N рядків після.
Андрій Регентов

-vабо --invert-matchвиберіть невідповідні лінії. У вашому випадку grep -v 'unwanted_word' fileабо grep --invert-match 'unwanted_word' file.
adamski.pro

Я хочу проігнорувати один рядок вгорі і один рядок внизу з відповідним шаблоном, то як я можу цього досягти?
Kanji Viroja

Чудово, я використовую це в git, щоб швидко вивчити статус мого репо, працює як принадність:git status -s |grep -v "folder_I_dont_care"
Бенджамінц

3
Дивно, це головна відповідь, але в деяких випадках це неправильно! Якщо я хочу знайти sun, за винятком випадків, коли це є sunrise, grep sun|grep -v sunriseпропускає рядок, що містить обидва sunі sunriseвідразу, це не те, що я хочу. grep -P 'sun(?!rise)'набагато краще.
greene

86

Я зрозумів питання як "Як я зіставляю слово, але виключаю інше", для якого одне рішення - це два грепи в серії: Перший греп - пошук потрібного "word1", другий "grep", виключаючи "word2":

grep "word1" | grep -v "word2"

У моєму випадку: мені потрібно розмежовувати "сюжет" і "#plot", який варіант "слова" грепа не буде робити ("#" не буквено-цифровий).

Сподіваюсь, це допомагає.


16
Вам слід змінити порядок, щоб отримати підсвічування word1.
Матвій

1
Я думаю, було б уточнити, щоб до цього прикладу додати заповнювач для імені файлу
Патрік,

39

Якщо ви 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 за замовчуванням
відрізняється

2
Зауважте, що grep -v -Pтакож працює без заперечення у регулярному вираженні.
cybersoft

"якщо баш ... вам потрібно буде втекти !" . Дякую, дякую, дякую! Ось чого я хотів!
Габріель Степлес

36

Правильним рішенням є використання grep -v "word" fileз його awkеквівалентом:

awk '!/word/' file

Однак якщо у вас трапляється більш складна ситуація, в якій ви хочете, скажімо, XXXз’являтися, а YYY не з’являтися, тоді вам awkстане в нагоді замість того, щоб прокласти декілька grepс:

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

Можна навіть сказати щось складніше. Наприклад: я хочу, щоб ті рядки, що містять XXXабо YYY, але не ZZZ:

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

тощо.


2
Здається, це набагато швидше, ніж grep -Pрішення для великих файлів.
MBR

@MBR grep -Pозначає використовувати регулярний переробка Perl, тому завантаження цього пакета буде набагато дорожчим, ніж звичайне grep.
fedorqui 'ТАК перестаньте шкодити'

10

Інвертувати відповідність за допомогою grep -v:

grep -v "unwanted word" file pattern

6

grep забезпечує опцію '-v' або '--invert-match' для вибору невідповідних ліній.

напр

grep -v 'unwanted_pattern' file_name

Це виведе всі рядки з імені файлу file_name, який не має "небажаного_патронного"

Якщо ви шукаєте шаблон у кількох файлах всередині папки, ви можете скористатись параметром рекурсивного пошуку наступним чином

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

Тут grep спробує перерахувати всі випадки 'поисковой_паттерн' у всіх файлах з поточного каталогу і передати його другому грепу для фільтрації 'небажаного_паттерна'. '|' - pipe повідомить оболонку для підключення стандартного виводу лівої програми (grep -r 'want_pattern' *) до стандартного вводу правої програми (grep -v 'нежеланий_патерн').


4

Цей -vпараметр покаже всі рядки, які не відповідають шаблону.

grep -v ^unwanted_word

-5

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

grep -iL speedup *

1
На вхідній сторінці: "-L, --файли-без збігу. Придушити нормальний вихід; замість цього надрукуйте ім'я кожного вхідного файлу, з якого нормально не було б надруковано жодний вихід. Сканування припиниться в першій відповідності. " (Наголос мною) Тож остерігайтесь цього!
xuiqzy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.