Grep n'honore pas --exclude-dir

12

J'ai du mal à chercher en /varraison d'un blocage /var/run. J'ai essayé d' exclure/var/run , mais cela ne produit pas les résultats escomptés:

$ 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

J'ai essayé les deux -exclude-dir=/var/runet -exclude-dir="/var/run". Les deux produisent les mêmes résultats.

Pourquoi mon grep échoue?

Comment exclure /var/rund'un grep récursif?


CentOS 7.2, avec Grep:

$ grep --version
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
jww
la source
1
L'avez-vous essayé avec juste --exclude-dir=/var/runsans les guillemets?
JakeGould
@JakeGould - oui; avec et sans. Permettez-moi d'ajouter cela à la question.
2016
@JakeGould Cela ne fait aucune différence: le grepprocessus ne voit pas les guillemets dans les deux cas. Bash les développe et il n'y a aucune substitution à effectuer, ils sont donc simplement supprimés. C'est le cas pour tous les obus que je connais.
wchargin

Réponses:

18

Je pense que c'est probablement parce que vous demandez explicitement grepune recherche récursive à partir de /var, et /var/runne correspond pas à un sous-répertoire sous /var.

Voir la page de manuel grep, qui indique:

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

RÉPARER

Par conséquent, pour corriger votre commande, modifiez le modèle d'exclusion, c'est-à-dire:

sudo grep -IR --exclude-dir="run" '45.78.157.165' /var | egrep -v '(audit|access)'
jihad
la source
J'ai une question similaire à cela. Comment changeriez-vous grep -r --exclude-dir=./root/js sometext .pour exclure un sous-dossier de l'emplacement actuel?
psynnott
3
Je ne suis pas sûr que les /s fassent quoi que ce soit. grep va dans chaque dossier et commence la recherche à ce point. En fait, il recherche toujours le dossier actuel. Si vous souhaitez exclure un sous-dossier (par exemple /home/me/dev/project1/js) et que vous recherchez à partir de nombreux dossiers (par exemple à partir de /home/me), vous devez spécifier le nom du dossier de base que vous souhaitez exclure (par exemple --exclude-dir=js). Malheureusement, cela exclura également TOUT sous-dossier du même nom, ailleurs dans la hiérarchie. Si vous voulez quelque chose avec plus de contrôle, vous pouvez essayer d'utiliser findavec grep.
jehad