การใช้ grep -v กับการขัดแย้งหลายข้อ


12

มีวิธีที่ง่ายกว่านี้หรือไม่? grep -v foo file | grep -v bar

อาจเป็นวิธีที่สง่างามมากที่จะทำกับ egrep แต่จะทำอย่างไรกับ grep เก่าธรรมดา?

แก้ไข: grep -v 'foo\|bar' fileดูเหมือนว่าจะทำงานเฉพาะกับ grep GNU ฉันอยู่บนโซลาริส มีทางออกอะไรบ้าง?


คำถามแปลก ๆ เพราะในตัวอย่างแรกที่คุณทำและจับคู่และในครั้งที่สองที่คุณกำลังทำหรือจับคู่ ผลลัพธ์จะเหมือนกันเฉพาะในเงื่อนไขที่เฉพาะเจาะจงเท่านั้น
greenoldman

1
ไม่ไม่ได้จริงๆ ในตัวอย่างที่สอง-vแฟล็กคือการปฏิเสธ not(A or B) == not(A) and not(B)
rahmu

คำตอบ:


21

คุณสามารถทดสอบได้หลายgrepคำสั่งในหนึ่งคำสั่งโดยส่งแต่ละนิพจน์ด้วย-eอาร์กิวเมนต์แทนอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกแรกตามที่คุณเห็น:

$ grep -v -e foo -e bar file

ที่กล่าวในสิ่งเดียวกันกับที่คุณสั่ง: พิมพ์บรรทัดจากfileที่ไม่มีทั้ง "foo" และ "bar"

โปรดทราบว่าการลบ-vสิ่งนี้กลับทำให้สมบูรณ์; มันเปลี่ยนการดำเนินการทางตรรกะเช่นกัน! คุณได้รับทุกบรรทัดที่มี "foo" หรือ "bar"


12

grep -Ev 'word1|word2' ควรทำงานได้ดี


เป็นอีกทางเลือกหนึ่งที่คุณสามารถใช้ egrep และปล่อยแบ็กสแลชสำหรับอักขระegrep -v 'word1|word2
ไพพ์

ปรากฎว่าสิ่งนี้ไม่ทำงานกับ grep ของ Solaris ฉันติดตั้ง grep GNU และทำงานได้อย่างสมบูรณ์ ฉันจะแก้ไขคำถามของฉันเพื่อให้เป็นโซลาริสเฉพาะ
rahmu

2
@rahmu \|เป็นส่วนขยาย grep ของ GNU แต่คุณสามารถบรรลุสิ่งเดียวกันในแบบพกพาด้วย-Eและตัว|ดำเนินการ
Gilles 'หยุดความชั่วร้าย' ใน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.