Grep tidak menghormati --exclude-dir

12

Saya mengalami masalah dalam mencari /varkarena hang di /var/run. Saya mencoba mengecualikan/var/run , tetapi tidak menghasilkan hasil yang diharapkan:

$ 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

Saya sudah mencoba keduanya -exclude-dir=/var/rundan -exclude-dir="/var/run". Keduanya menghasilkan hasil yang sama.

Mengapa grep saya gagal?

Bagaimana saya mengecualikan /var/rungrep rekursif?


CentOS 7.2, dengan Grep:

$ grep --version
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.
jww
sumber
1
Apakah Anda mencobanya dengan hanya --exclude-dir=/var/runtanpa tanda kutip?
JakeGould
@JakeGould - ya; baik dengan dan tanpa. Biarkan saya menambahkannya ke pertanyaan.
jww
@JakeGould Tidak ada bedanya: grepproses tidak melihat tanda kutip dalam kedua kasus. Bash memperluas mereka, dan tidak ada substitusi yang harus dilakukan, sehingga mereka hanya dihapus. Ini adalah kasus untuk semua kerang yang saya tahu.
wchargin

Jawaban:

18

Saya pikir itu mungkin karena Anda secara eksplisit meminta grepuntuk mencari secara rekursif /var, dan /var/runtidak cocok dengan SUBDIRECTORY di bawah /var.

Lihat halaman manual grep, yang menyatakan:

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

MEMPERBAIKI

Karena itu, untuk memperbaiki perintah Anda, ubah pola kecualikan, yaitu:

sudo grep -IR --exclude-dir="run" '45.78.157.165' /var | egrep -v '(audit|access)'
jehad
sumber
Saya punya pertanyaan serupa dengan ini. Bagaimana Anda mengubah grep -r --exclude-dir=./root/js sometext .untuk mengecualikan subfolder dari lokasi saat ini?
psynnott
3
Tidak yakin dia /melakukan apa pun. grep masuk ke setiap folder dan memulai pencarian pada saat itu. Secara efektif selalu mencari folder saat ini. Jika Anda ingin mengecualikan sub-folder (mis. /home/me/dev/project1/js) Dan Anda mencari dari banyak folder ke atas (mis. Mulai dari /home/me), maka Anda perlu menentukan satu nama folder dasar yang ingin Anda kecualikan (mis --exclude-dir=js.). Sayangnya, ini juga akan mengecualikan sub-folder APAPUN dengan nama yang sama, di tempat lain dalam hierarki. Jika Anda menginginkan sesuatu dengan kontrol yang lebih, Anda dapat mencoba untuk melihat dengan menggunakan finddengan grep.
jehad