Grep ehrt nicht --exclude-dir

10

Ich habe Probleme beim Suchen /var wegen eines hängen an /var/run. Ich versuchte zu ausschließen /var/run, aber es führt nicht zu erwarteten Ergebnissen:

$ 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

Ich habe beide probiert -exclude-dir=/var/run und -exclude-dir="/var/run". Beide produzieren die gleichen Ergebnisse.

Warum versagt mein Grep?

Wie schließe ich aus? /var/run von einem rekursiven Grep?


CentOS 7.2 mit Grep:

$ grep --version
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
jww
quelle
1
Hast du es einfach mit probiert --exclude-dir=/var/run ohne die Anführungszeichen?
JakeGould
@JakeGould - ja; sowohl mit als auch ohne. Lassen Sie mich das zur Frage hinzufügen.
jww
@ JakeGould Es macht keinen Unterschied: die grep In beiden Fällen werden die Anführungszeichen nicht angezeigt. Bash erweitert sie, und es muss kein Ersatz durchgeführt werden, sodass sie einfach entfernt werden. Dies ist der Fall für alle Muscheln, die ich kenne.
wchargin

Antworten:

16

Ich denke es liegt wahrscheinlich daran, dass Sie explizit fragen grep rekursiv suchen von /var, und /var/run stimmt nicht mit einem SUBDIRECTORY unter überein /var.

Siehe grep man page, die besagt:

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

FIX

Um Ihren Befehl zu korrigieren, ändern Sie daher das Ausschlussmuster, d. H .:

sudo grep -IR --exclude-dir="run" '45.78.157.165' /var | egrep -v '(audit|access)'
jehad
quelle
Ich habe eine ähnliche Frage dazu. Wie würdest du dich ändern? grep -r --exclude-dir=./root/js sometext . kann ich einen Unterordner vom aktuellen Speicherort ausschließen?
psynnott
3
Ich bin nicht sicher, ob der / Ich mache alles. grep geht in jeden Ordner und beginnt an dieser Stelle mit der Suche. Es wird effektiv immer der aktuelle Ordner durchsucht. Wenn Sie einen Unterordner ausschließen möchten (z. /home/me/dev/project1/js ) und Sie suchen aus vielen Ordnern (z. B. ab /home/me ), müssen Sie den Namen des Basisordners angeben, den Sie ausschließen möchten (z. --exclude-dir=js ). Leider schließt dies auch ANY-Unterordner mit demselben Namen an anderer Stelle in der Hierarchie aus. Wenn Sie etwas mehr Kontrolle haben möchten, können Sie versuchen, mit zu suchen find mit grep.
jehad