grep วิธีการระงับการแสดงไฟล์ที่ไม่ตรงกัน?


11

ฉันพยายามค้นหาไฟล์ที่มีคำเฉพาะที่ใช้grepอยู่ มีไฟล์จำนวนมากในไดเรกทอรี (> 500)

คำสั่งที่ฉันวิ่ง

$ grep 'delete' *

เอาท์พุต

validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines

ไฟล์เหล่านี้เป็นไฟล์ที่ไม่มีการจับคู่ที่กำหนด ฉันต้องการระงับบรรทัดเหล่านั้นไม่ให้แสดงจนถึง stdout ฉันรู้ว่า-qสวิตช์ แต่นั่นจะระงับเอาต์พุตทั้งหมดซึ่งฉันไม่ต้องการ

ฉันจะทำอย่างไร


2
โดยปกติgrepไม่ควรพิมพ์ชื่อไฟล์ของไฟล์ที่ไม่ตรงกัน ที่จริงแล้วดูเหมือนว่าจะgrepพิจารณาบรรทัดที่มีเนื้อหา0ที่จะจับคู่ คุณสามารถโพสต์รูปแบบการค้นหาที่แน่นอนที่คุณใช้อยู่ได้หรือไม่?
Adrian Heine

cmp grep ที่สมบูรณ์ที่ฉันใช้คือgrep 'delete' * -Rแต่ฉันไม่คิดว่า-Rจะทำให้เกิดปัญหาใด ๆ และใช่มันปกติจะไม่พิมพ์คนที่ไม่ได้จับคู่ แต่ไม่แน่ใจว่าสิ่งที่กรณีที่นี่ ...
27732

@step @everyone .. แปลก ... หลังจากเห็นโพสต์ที่แก้ไขแล้วข้างต้น ฉันลองgrep -- 'delete' *(เพิ่ม--) และใช้งานได้ตามที่คาดไว้ การถอด--จะนำไปสู่การแสดงด้านบน
mtk

1
@ สตีเฟ่นแน่นอนคุณถูกต้อง ฉันค้นหา dir ... -ciและมีแฟ้มที่มีชื่อ ขอบคุณสำหรับการแก้ไขปัญหา คุณสามารถโพสต์ภาพจำลองนี้เป็นคำตอบ
mtk

คำตอบ:


9

grep -cนั่นเป็นพฤติกรรมแสดงโดย

อาจเป็นไปได้ว่าคุณมีไฟล์ที่ชื่อขึ้นต้นด้วย-และมีcตัวอักษรและคุณใช้ GNU grep โดยไม่ต้องตั้งค่าPOSIXLY_CORRECTตัวแปรสภาพแวดล้อม

ใช้:

grep -- delete *

หรือดีกว่า:

grep delete ./*

--ทำเครื่องหมายจุดสิ้นสุดของตัวเลือกเพื่อให้ชื่อไฟล์จะไม่ถูกพิจารณาว่าเป็นตัวเลือก (ด้วย POSIX grep มันจะไม่เกิดขึ้นเนื่องจากdeleteอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกจะทำเครื่องหมายจุดสิ้นสุดของตัวเลือก) แต่จะไม่แก้ไขปัญหาของ -ไฟล์ที่เรียกว่า grep delete ./*มีประสิทธิภาพมากขึ้น แต่มีข้อเสียเปรียบของการแสดงผลพิเศษที่./สำหรับไฟล์ที่ตรงกัน (แม้ว่าที่อาจได้รับการพิจารณาโบนัสตั้งแต่ที่ช่วยระบุชื่อไฟล์ที่มีตัวอักษรขึ้นบรรทัดใหม่)


12

เพิ่ม

| grep -v ':0$'

ไม่หรูหรามาก แต่ฉันคิดว่าจะทำงาน

การเพิ่ม-lคำสั่งของคุณจะให้เฉพาะการจับคู่ แต่มันจะหยุดการพิมพ์จำนวนการจับคู่สำหรับแต่ละไฟล์


1
-lทำงาน การแก้ไขก็ดีเช่นกัน ขอบคุณ
mtk

4
บรรทัด grep ควรเป็นgrep -v ':0$'เช่นนั้นเฉพาะที่ท้ายบรรทัดเท่านั้นที่ตรงกัน (อย่างไรก็ตามgrep -lวิธีการนั้นดีกว่าตราบใดที่คุณไม่จำเป็นต้องมีการนับบรรทัด)
mreithub

9

การใช้งานgrep -lคุณจะได้รับไฟล์ที่มีการแข่งขันอย่างน้อยหนึ่งรายการเท่านั้น

คุณต้องการข้อมูลเกี่ยวกับจำนวนไฟล์ที่ตรงกันในไฟล์หรือไม่? เนื่องจากคุณสามารถข้ามการใช้-cซึ่งใช้นับจำนวนการแข่งขันในไฟล์

แก้ไข: และเช่นเดียวกับ Warlock ที่กล่าวว่าการใช้-Iเพื่อระงับการจับคู่ในไฟล์ไบนารีอาจเป็นความคิดที่ดี


0

วิธี grep ที่ไม่ใช่ค่าศูนย์นับ:

grep -rIcH 'string' . | grep -v ':0$'

  • -r เรียกคืนไดเรกทอรีย่อย
  • -Iละเว้นไฟล์ไบนารี(ขอบคุณ@tongpu , warlock)
  • -cแสดงจำนวนการแข่งขัน น่ารำคาญรวมถึงไฟล์ 0-count
  • -H แสดงชื่อไฟล์แม้ว่าจะมีเพียงหนึ่งไฟล์
  • 'string' สายของคุณไปที่นี่
  • . เริ่มจากไดเรกทอรีปัจจุบัน
  • | -v ':0$'ลบไฟล์ 0-count (ขอบคุณ@LaurentiuRoescu )

(ฉันรู้ว่า OP มีการนับโดยไม่ได้ตั้งใจ - c แต่พื้นที่ของ Google (นับ grep ไม่ใช่ศูนย์) ที่นี่)


0

เช่นเดียวกับคำตอบของ Laurentiu คุณยังสามารถใช้รายการของ-lไฟล์อินพุตสำหรับ grep:
grep -r "pattern" -c $(grep -rl "pattern")
มันช่วยให้การเก็บสีของ grep แต่ทำสิ่งเดียวกันในพื้นหลัง


โปรดทราบว่าชื่อไฟล์และไดเรกทอรีที่มีช่องว่างหรือไวด์การ์ดใด ๆ จะถูกแยกและจับคู่โดยบังเอิญ
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.