Grep ไม่เคารพ - ยกเว้น -dir


12

ฉันมีปัญหาในการค้นหาเนื่องจากการแขวนที่/var /var/runฉันพยายามยกเว้น/var/runแต่ไม่ได้ผลลัพธ์ที่คาดหวัง:

$ 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

ฉันได้พยายามทั้งสองและ-exclude-dir=/var/run -exclude-dir="/var/run"ทั้งคู่ให้ผลลัพธ์ที่เหมือนกัน

ทำไม grep ของฉันถึงล้มเหลว

ฉันจะแยก/var/runออกจาก grep แบบเรียกซ้ำได้อย่างไร


CentOS 7.2 โดยมี Grep:

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

1
คุณลอง--exclude-dir=/var/runโดยไม่มีคำพูด?
JakeGould

@ JakeGould - ใช่; ทั้งที่มีและไม่มี ให้ฉันได้รับการเพิ่มคำถาม
jww

@ JakeGould มันไม่ต่างกัน: grepกระบวนการไม่เห็นราคาในทั้งสองกรณี ทุบตีขยายพวกเขาและไม่มีการทดแทนที่จะดำเนินการดังนั้นพวกเขาจะถูกลบออกเพียงแค่ นี่เป็นกรณีสำหรับเชลล์ทั้งหมดที่ฉันรู้จัก
wchargin

คำตอบ:


18

ฉันคิดว่าอาจเป็นเพราะคุณขอgrepให้ค้นหาอย่างละเอียดซ้ำ/varๆ และ/var/runไม่ตรงกับ SUBDIRECTORY ด้าน/varล่าง

ดู grep man page ซึ่งระบุว่า:

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

การแก้ไข

ดังนั้นเพื่อแก้ไขคำสั่งของคุณเปลี่ยนรูปแบบการยกเว้นเช่น:

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

ฉันมีคำถามที่คล้ายกันนี้ คุณจะเปลี่ยนวิธีgrep -r --exclude-dir=./root/js sometext .แยกโฟลเดอร์ย่อยออกจากตำแหน่งปัจจุบันได้อย่างไร
psynnott

3
ไม่แน่ใจว่า/ทำอะไร grep เข้าสู่แต่ละโฟลเดอร์และเริ่มการค้นหา ณ จุดนั้น มันจะค้นหาโฟลเดอร์ปัจจุบันได้อย่างมีประสิทธิภาพเสมอ หากคุณต้องการแยกโฟลเดอร์ย่อย (เช่น/home/me/dev/project1/js) และคุณกำลังค้นหาจากหลาย ๆ โฟลเดอร์ขึ้นไป (เช่นเริ่มต้นที่/home/me) คุณจะต้องระบุชื่อโฟลเดอร์พื้นฐานหนึ่งโฟลเดอร์ที่คุณต้องการยกเว้น (เช่น--exclude-dir=js) น่าเสียดายนี่จะเป็นการยกเว้นโฟลเดอร์ย่อยใด ๆ ที่มีชื่อเดียวกัน แต่ที่อื่น ๆ ในลำดับชั้น ถ้าคุณต้องการบางสิ่งบางอย่างที่มีการควบคุมมากขึ้นคุณสามารถลองไปดูที่ใช้กับfind grep
jehad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.