Отрицательное сопоставление с использованием grep (строки соответствия, которые не содержат foo)

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

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

или

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

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

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

Ответ 1

grep -v - ваш друг:

grep --help | grep invert  

-v, -invert-match выбирает несогласованные строки

Также проверьте связанный -L (дополнение к -L).

-L, --files-without-match только печатать имена FILE, не содержащие соответствия

Ответ 2

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

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

awk '!/foo/'

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

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

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

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

И так далее.

Ответ 3

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

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

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

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log