Grep не соблюдает --exclude-dir

12

У меня проблемы с поиском /varиз-за зависания /var/run. Я пытался исключить/var/run , но это не дает ожидаемых результатов:

$ sudo grep -IR --exclude-dir="/var/run" '45.78.157.165' /var | egrep -v '(audit|access)'
/var/log/secure:Jun 21 14:08:34 cryptopp sshd[19729]: error: Received disconnect from 199.91.135.157: 3: com.jcraft.jsch.JSchException: reject HostKey: 45.78.157.165 [preauth]
/var/log/secure-20160626:Jun 21 14:08:34 cryptopp sshd[19729]: error: Received disconnect from 199.91.135.157: 3: com.jcraft.jsch.JSchException: reject HostKey: 45.78.157.165 [preauth]
/var/log/secure-20160626:Jun 21 14:08:34 cryptopp sshd[19729]: error: Received disconnect from 199.91.135.157: 3: com.jcraft.jsch.JSchException: reject HostKey: 45.78.157.165 [preauth]
grep: /var/run/saslauthd/mux: No such device or address
grep: /var/run/dbus/system_bus_socket: No such device or address
grep: /var/run/rpcbind.sock: No such device or address
grep: /var/run/udev/control: No such device or address

Я пробовал и то -exclude-dir=/var/runи другое -exclude-dir="/var/run". Оба дают одинаковые результаты.

Почему мой grep терпит неудачу?

Как исключить /var/runиз рекурсивного grep?


CentOS 7.2, с Grep:

$ grep --version
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
jww
источник
1
Вы пробовали это просто --exclude-dir=/var/runбез кавычек?
JakeGould
@JakeGould - да; как с, так и без. Позвольте мне добавить это к вопросу.
июня
@JakeGould Это не имеет значения: grepпроцесс не видит кавычки в любом случае. Bash расширяет их, и выполнять замену не нужно, поэтому они просто удаляются. Это касается всех известных мне оболочек.
wchargin

Ответы:

18

Я думаю, что это, вероятно, потому что вы явно запрашиваете grepрекурсивный поиск /var, а /var/runне соответствует SUBDIRECTORY в /var.

Смотрите страницу руководства grep, которая гласит:

--exclude-dir=glob
    [..] skip any subdirectory whose base name matches glob.  [..]

FIX

Поэтому, чтобы исправить вашу команду, измените шаблон исключения, т.е.

sudo grep -IR --exclude-dir="run" '45.78.157.165' /var | egrep -v '(audit|access)'
джихад
источник
У меня есть похожий вопрос к этому. Как бы вы изменили, grep -r --exclude-dir=./root/js sometext .чтобы исключить подпапку из текущего местоположения?
psynnott
3
Не уверен, что они /делают что-нибудь. grep входит в каждую папку и начинает поиск с этой точки. Это эффективно всегда поиск в текущей папке. Если вы хотите исключить подпапку (например /home/me/dev/project1/js) и ищете во многих папках вверх (например, начиная с /home/me), то вам нужно указать имя одной базовой папки, которую вы хотите исключить (например --exclude-dir=js). К сожалению, это также исключит ЛЮБУЮ подпапку с тем же именем в другом месте иерархии. Если вы хотите что-то с большим контролем, вы можете попробовать использовать findс grep.
Jehad