Отрицательное сопоставление с использованием grep (сопоставление строк, не содержащих foo) - PullRequest
848 голосов
/ 23 августа 2010

Я пытался определить синтаксис этой команды:

grep ! error_log | find /home/foo/public_html/ -mmin -60

или

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

Мне нужно увидеть все файлы, которые были изменены, кроме именованных error_log.

Я читал об этом здесь , но нашел только один шаблон not -regex.

Ответы [ 3 ]

1532 голосов
/ 23 августа 2010

grep -v ваш друг:

grep --help | grep invert  

-v, --invert-match выбрать несовпадающие строки

Также ознакомьтесь с соответствующими -L (дополнение к -l).

-L, --files-with-match only печатать имена файлов, не содержащие совпадений

115 голосов
/ 20 июня 2015

Вы также можете использовать awk для этих целей, поскольку он позволяет выполнять более сложные проверки более понятным способом:

Строки, не содержащие foo:

awk '!/foo/'

Строки, не содержащие ни foo, ни bar:

awk '!/foo/ && !/bar/'

Строки, не содержащие ни foo, ни bar, содержащие foo2 или bar2:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

И так далее.

12 голосов
/ 02 ноября 2015

В вашем случае вы, вероятно, не хотите использовать grep, но вместо этого добавьте к команде find отрицательное предложение, например,

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

Если вы хотите включить в имя символы подстановки, вам придется их избежать, например, исключить файлы с суффиксом .log:

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...