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.

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)'

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.