Grep không tôn vinh --exclude-dir


12

Tôi đang gặp khó khăn khi tìm kiếm /vardo bị treo tại /var/run. Tôi đã cố gắng loại trừ/var/run , nhưng nó không tạo ra kết quả như mong đợi:

$ 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

Tôi đã thử cả hai -exclude-dir=/var/run-exclude-dir="/var/run". Cả hai đều cho kết quả như nhau.

Tại sao grep của tôi thất bại?

Làm thế nào để tôi loại trừ /var/runkhỏi một grep đệ quy?


CentOS 7.2, với Grep:

$ grep --version
grep (GNU grep) 2.20
Copyright (C) 2014 Free Software Foundation, Inc.

1
Bạn đã thử nó --exclude-dir=/var/runmà không có dấu ngoặc kép?
JakeGould

@JakeGould - vâng; cả có và không có. Hãy để tôi có được thêm vào câu hỏi.
jww

@JakeGould Không có gì khác biệt: grepquá trình không thấy dấu ngoặc kép trong cả hai trường hợp. Bash mở rộng chúng, và không có sự thay thế nào được thực hiện, vì vậy chúng chỉ đơn giản là bị loại bỏ. Đây là trường hợp cho tất cả các vỏ mà tôi biết.
wchargein

Câu trả lời:


18

Tôi nghĩ rằng có lẽ bởi vì bạn rõ ràng yêu cầu greptìm kiếm đệ quy từ /var/var/runkhông phù hợp với một ĐỐI TƯỢNG bên dưới /var.

Xem trang grep man, trong đó nêu:

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

SỬA CHỮA

Do đó, để sửa lệnh của bạn, hãy thay đổi mẫu loại trừ, nghĩa là:

sudo grep -IR --exclude-dir="run" '45.78.157.165' /var | egrep -v '(audit|access)'

Tôi có một câu hỏi tương tự như thế này. Làm thế nào bạn sẽ thay đổi grep -r --exclude-dir=./root/js sometext .để loại trừ một thư mục con khỏi vị trí hiện tại?
psynnott

3
Không chắc chắn /s làm bất cứ điều gì. grep đi vào từng thư mục và bắt đầu tìm kiếm tại thời điểm đó. Đó là hiệu quả luôn luôn tìm kiếm các thư mục hiện tại. Nếu bạn muốn loại trừ một thư mục con (ví dụ /home/me/dev/project1/js) và bạn đang tìm kiếm từ nhiều thư mục trở lên (ví dụ: bắt đầu từ /home/me), thì bạn cần chỉ định một tên thư mục cơ sở bạn muốn loại trừ (ví dụ --exclude-dir=js). Thật không may, điều này cũng sẽ loại trừ bất kỳ thư mục con cùng tên, ở nơi khác trong hệ thống phân cấp. Nếu bạn muốn một cái gì đó với kiểm soát nhiều hơn, bạn có thể thử để xem xét sử dụng findvới grep.
jehad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.