ดูไฟล์ที่ไม่มีบรรทัดด้วยสตริงที่แน่นอน


12

ค้นหาโปรแกรมเช่นtailหรือlessที่ให้ฉันดูบันทึกของฉันไม่มีบรรทัดที่มีสตริงที่แน่นอน ตัวอย่างเช่นดู syslog ของฉันโดยไม่มี[UFW BLOCK]บรรทัดรายการUFW ( )


แม้ว่าจะไม่ใช่วิธีง่าย ๆ ที่จะให้คำอธิบายปัญหาที่แน่นอนของคุณด้วยคุณสมบัตินี้ แต่คุณอาจสนใจที่จะรู้ว่าlessมีความเป็นไปได้ที่จะกรองบรรทัดที่แสดงหลังจากรูปแบบ regex คุณสามารถใช้คุณสมบัตินี้โดยการพิมพ์&ตามด้วยรูปแบบและคุณสามารถเปลี่ยนกลับได้โดยพิมพ์&เพียงอย่างเดียว
แอรอน

คำตอบ:


13

ตัวเลือกรูปแบบการจับคู่แบบผกผัน-vสำหรับgrepมีประโยชน์กับสิ่งนี้:

grep -v 'UFW BLOCK' /var/log/syslog

UFW BLOCKนี้จะแสดงให้คุณทุกสายไม่ได้มี ในฐานะที่เป็นgrepการแสดงออกปกติการใช้งานขั้นพื้นฐานโดยค่าเริ่มต้นรวมของวงเล็บจะทำให้ค้นหาใด ๆ ของตัวละครแต่ละ 'UFW BLOCK รวมทั้งพื้นที่ คุณอาจท้ายไม่มีผลลัพธ์ หากคุณต้องการให้แน่ใจว่ามีวงเล็บอยู่รอบ ๆ สตริงไม่ว่าจะใช้ Escape \[UFW BLOCK\]หรือใช้-Fตัวเลือกgrepเพื่อรวมเฉพาะสตริงคงที่ (ขอบคุณZannaและSteeldriverสำหรับคำแนะนำในเรื่องนี้):

grep -Fv '[UFW BLOCK]' /var/log/syslog

คุณสามารถทำให้การดูง่ายขึ้นโดยการวางเอาต์พุตไปยังเพจเจอร์เช่นless:

grep -v 'UFW BLOCK' /var/log/syslog | less

หรือเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ในโฮมไดเร็กตอรี่ของคุณเพื่อดูในภายหลัง:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog

2
คุณยังสามารถใช้fgrepคำสั่งที่เทียบเท่าgrep -Fได้
Tulains Córdova

2
@ คนของ grep TulainsCórdovaกล่าวว่า "การร้องขอโดยตรงเช่น egrep หรือ fgrep นั้นเลิกใช้ แต่มีไว้เพื่ออนุญาตให้แอปพลิเคชันทางประวัติศาสตร์ที่พึ่งพาพวกเขาให้เรียกใช้แบบไม่ได้แก้ไข" ฉันไม่ทราบว่าพวกเขาจะเคยชินกับการคัดค้านนี้หรือไม่ แต่ฉันเดาว่าการใช้คำสั่งเหล่านี้ไม่ใช่วิธีปฏิบัติที่ดีที่สุด
Aaron

5

นอกจากนี้คุณยังสามารถใช้sedเป็นdคำสั่งเพื่อลบเส้นที่มีรูปแบบจากลำธารที่:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

เราหลบหนี[]ตามปกติพวกเขาแสดงคลาสตัวละครความหมาย "จับคู่สิ่งที่อยู่ภายในที่นี่"


5

คุณสามารถใช้เครื่องมือใดก็ได้ที่มีความสามารถในการแก้ไข คุณได้รับการแก้ปัญหาโดยใช้grepแล้วและsedนี่คือตัวเลือกอื่น ๆ ทั้งหมดเหล่านี้ได้อย่างง่ายดายสามารถประปาlessหรือmoreหรือสิ่งอื่นใด

  1. Perl

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    ตั้งแต่นี้คือ Perl TIMTOWDI! .

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    

2

คุณสามารถใช้awk:

awk '!/PATTERN/' log

ฉันใช้เมื่อฉันมี "รูปแบบ" มากกว่าหนึ่งรูปแบบและฉันไม่ต้องการใช้สองรูปgrepแบบ:

... | grep -v foo | grep -v bar

ซึ่งไวยากรณ์คือ:

awk '!/PATTERN/ && !/PATTERN2/' log

"ฉันใช้มันเมื่อฉันมีมากกว่าหนึ่งรูปแบบ" และฉันไม่ต้องการใช้ grep สองตัวเช่น "------ grep -Ev "foo|bar"?
αғsнιη

คุณยังสามารถใช้-eเพื่อกำหนดหลายรูปแบบ grep -v -e 'foo' -e 'bar'
2560

@AFSHIN (ไม่ทราบวิธีที่ความคิดเห็นของฉันได้ออก) ผมหมายสำหรับตรรกะและไม่ได้หรือ;)
Ravexina

1

ด้วยตัวเลือกlessของคำสั่ง&คุณสามารถกรองเพื่อแสดงรูปแบบการจับคู่ที่ต้องการได้ดังนี้

& /PATTERN/

ในกรณีของคุณหากคุณต้องการให้ตัวกรองบรรทัดUFW BLOCKไม่แสดงในเอาต์พุตคุณสามารถใช้&!ดังต่อไปนี้:

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