grep ไม่รวมหลายสตริง


117

ฉันพยายามดูไฟล์บันทึกโดยใช้ tail -fและต้องการยกเว้นทุกบรรทัดที่มีสตริงต่อไปนี้:

"Nopaging the limit is"`  and `"keyword to remove is"

ฉันสามารถยกเว้นหนึ่งสตริงได้ดังนี้:

tail -f admin.log|grep -v "Nopaging the limit is"

แต่ฉันจะแยกบรรทัดที่มีstring1หรือstring2.

คำตอบ:


107

สองตัวอย่างของการกรองหลายบรรทัดด้วย grep:

ใส่สิ่งนี้ในfilename.txt:

abc
def
ghi
jkl

คำสั่ง grep โดยใช้อ็อพชัน -E โดยมีไพพ์ระหว่างโทเค็นในสตริง:

grep -Ev 'def|jkl' filename.txt

พิมพ์:

abc
ghi

คำสั่งโดยใช้อ็อพชัน -v โดยมีไพพ์ระหว่างโทเค็นที่ล้อมรอบด้วย parens:

egrep -v '(def|jkl)' filename.txt

พิมพ์:

abc
ghi

15
ฉันแปลกใจที่ไม่มีใครพูดถึงgrep -v -e def -e jklวิธีการที่ IMHO ชัดเจนกว่า…
Frizlab

4
หรือดีกว่า: grep -Fv -e def -e jklซึ่งเร็วกว่า!
Frizlab

11
ด้วยแฟล็ก -F คุณสามารถใช้บรรทัดใหม่เป็นตัวคั่นแทนไพพ์ ซึ่งช่วยให้ใช้เอาต์พุตคำสั่งเป็นตัวกรองได้ง่ายขึ้นเช่นgrep -vF $(pgrep myprocess)
Phlarx

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F จับคู่ตามสตริงตามตัวอักษร (แทน regex)

-v สลับการจับคู่

-e อนุญาตให้ใช้รูปแบบการค้นหาหลายรูปแบบ (ตามตัวอักษรและแบบกลับด้าน)


1
นี่คือคำตอบที่ถูกต้อง: สิ่งเดียวที่หลีกเลี่ยงทั้งหลายgrep -vอินสแตนซ์และข้อกำหนดเทียมของ regex (อนุญาตให้ระบุสตริงจำนวนมากในอาร์กิวเมนต์แยกกันอย่างชัดเจน) ลองนึกภาพการสร้าง regex นั้นโดยใช้โปรแกรมในสคริปต์สำหรับสตริงที่สามารถมีอะไรก็ได้ ...
user2394284

อันที่จริงไม่มีคำตอบที่ถูกต้องเพราะเมื่อไม่มีคำหลักที่จะยกเว้นมันจะยกเว้นทุกอย่างแทนที่จะไม่มีอะไร
GyőriSándor

37

อีกทางเลือกหนึ่งคือการสร้างรายการที่ไม่รวมซึ่งเป็นประโยชน์อย่างยิ่งเมื่อคุณมีรายการสิ่งที่ต้องแยกยาว ๆ

vi /root/scripts/exclude_list.txt

ตอนนี้เพิ่มสิ่งที่คุณต้องการยกเว้น

Nopaging the limit is
keyword to remove is

ตอนนี้ใช้ grep เพื่อลบบรรทัดออกจากไฟล์บันทึกของคุณและดูข้อมูลที่ไม่ได้รับการยกเว้น

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
ฉันไม่รู้ว่าคุณสามารถใช้-vกับ-f(หรือว่าหลังมีอยู่จริง)
Sridhar Sarnobat

มีประโยชน์มาก!
samaspin

โปรดทราบว่าคุณไม่จำเป็นต้องสร้างไฟล์ชั่วคราวสำหรับรายการยกเว้น ในการทุบตีคุณสามารถใช้การทดแทนกระบวนการ สิ่งนี้มีประโยชน์หากรายการยกเว้นเป็นแบบไดนามิกและคุณต้องสร้างขึ้นก่อนการใช้งานแต่ละครั้งจึงจะใช้ได้เพียงครั้งเดียว:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav




5

Greps สามารถล่ามโซ่ได้ ตัวอย่างเช่น:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

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