การจับคู่เชิงลบหลายรูปแบบ Grep


14

ดังนั้นฉันจึงมีบันทึกของ Apache จำนวนมากโดยใช้รูปแบบบันทึกมาตรฐาน ฉันต้องการรับบันทึกการใช้งานทั้งหมดที่ไม่ได้มาจากโปรแกรมรวบรวมข้อมูลเว็บ

ดังนั้นสมมติว่าฉันมีไฟล์ robot_patterns พร้อมรายการเช่น

Googlebot
msnbot-media
YandexBot
bingbot

ถ้าฉันรันคำสั่งgrep -f robot_patterns *.logฉันจะได้รับรายการทั้งหมดโดยบอทที่ตรงกับรูปแบบข้างต้น รายการจริงของฉันมีบอทและตัวแทนประมาณ 30 รายการที่ฉันต้องการเพิกเฉย

แต่ฉันต้องการค้นหารายการทั้งหมดที่ไม่ได้มาจากบ็อต ดังนั้นฉันจึงพยายามgrep -v -f robot_patterns *.logและไม่ส่งกลับผลลัพธ์โดย grep นี่ไม่ใช่สิ่งที่ฉันคาดหวังหรือปรารถนาและฉันไม่ได้หาวิธีที่ชัดเจนเพื่อให้ได้สิ่งที่ฉันต้องการ เมื่อใช้-vตัวเลือกที่รวมกับหลายรูปแบบในไฟล์ grep จะส่งคืนบรรทัดที่ตรงกันหากตรงกับทุกรูปแบบ


เมื่อฉันลองทำสิ่งนี้ในระบบของฉัน grep -v -f มีพฤติกรรมที่ต้องการเพียงแค่ส่งคืนบรรทัดที่ไม่ตรงกับรูปแบบใดเลย นี่คือกับ (grep GNU) 2.14.56-1e3d คุณใช้ grep ประเภทใด
wingedsubmariner

GNU grep 2.6.3ฉันกำลังทำงาน
Zoredache

4
ฉันทำการทดสอบเพิ่มเติมและพบว่าหากมีบรรทัดว่างในไฟล์รูปแบบมันจะจับคู่กับทุกบรรทัดทำให้ไม่มีบรรทัดที่จะส่งคืนด้วย -v นี่ไม่ใช่ปัญหากับ -F อย่างไรก็ตามและ -F อาจเพิ่ม grep สำหรับงานของคุณ - อาจคุ้มค่าที่จะลองใช้
wingedsubmariner

บรรทัดว่างต่อท้าย! โอ๊ะ ... ดูเหมือนว่าจะเป็นปัญหา หากคุณต้องการคุณควรเพิ่มคำตอบนั้น
Zoredache

คำตอบ:


8

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

นี้ไม่ได้เป็นปัญหากับ-Fแต่เนื่องจากละเว้นว่างเส้นที่มีgrep ทำให้เกิดการตีความบรรทัดเป็นสตริงที่ง่ายต่อการค้นหาและอาจเร็วขึ้นหากไม่จำเป็นต้องมีการแสดงออกปกติ-F
-Fgrepgrep


1
GNU fgrepเพิกเฉยสตริงว่างเปล่าต่อท้ายเป็นข้อผิดพลาดที่ได้รับการแก้ไขใน 2.19 ( คอมมิชชัน 2d3832e1ff772dc1a374bfad5dcc1338350cc48bดังนั้นคุณไม่ควรพึ่งพามัน
Stéphane Chazelas

13

คุณสามารถลอง:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
ยินดีต้อนรับสู่ Unix & Linux OP มีรายการของสตริงประมาณ 30 รายการที่เขาต้องการละเว้นและสี่รายการที่เขานำเสนอเป็นตัวอย่างมีความยาวเฉลี่ยสิบอักขระแต่ละตัวดังนั้นคำสั่งของคุณน่าจะมีความยาวมากกว่า 300 อักขระ นี่เป็นเรื่องยากที่จะรักษา (และแม้กระทั่งอ่าน) คุณสามารถแก้ไขคำตอบของคุณเพื่อขับเคลื่อนโดยรายการสตริงของ OP ได้หรือไม่? …………………………………………………………………ปล. คุณสังเกตเห็นคำตอบไหม? - OP ได้เรียนรู้วิธีการทำงานแบบดั้งเดิมของเขา
G-Man กล่าวว่า 'Reinstate Monica'

2
เหตุใดจึงประเมินการตอบสนองในเชิงลบของฉัน : /
Orsius

3
คำตอบที่ดี มี regex OR และตัวเลือก -vE มีประโยชน์
Kirt Carson

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