ในหาง -f ฉันจะกรองสิ่งที่มีคำหลักบางคำได้อย่างไร


39

ฉันต้องการtail -fบันทึกของฉัน อย่างไรก็ตามฉันต้องการกรองทุกอย่างที่มีคำว่า:

"ELB", "Pingdom", "Health"


2
ด้วยvanheusden.com/multitailคุณสามารถระบายสีสิ่งสำคัญหรือกรองสิ่งที่คุณไม่ต้องการดูตัวอย่าง config pantz.org/software/multitail/multitailconfig.html
oluies

คำตอบ:


58

ฉันไม่รู้เกี่ยวกับการใช้ awk แทน grep แต่มันใช้ได้กับฉัน:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

แก้ไข:ตามที่dmouratiและCaleb ชี้ให้เห็นคุณสามารถใช้egrepแทนgrep -Eเพื่อความสะดวก ในบางระบบการทำเช่นนี้จะเป็นการเชื่อมโยงไปยังไบนารีเดียวกันในระบบอื่น ๆ สำเนาของมันจะถูกจัดหาโดย grep package ไม่ว่าจะเป็นทางเลือกใดสำหรับ-Eสวิตช์ อย่างไรก็ตามตามหน้า grep man GNU:

[…] สองโปรแกรมที่แตกต่างegrepและfgrepมีให้ เป็นเช่นเดียวกับegrep เป็นเช่นเดียวกับ การร้องขอโดยตรงเป็นอย่างใดอย่างหนึ่งหรือเลิกใช้งาน แต่มีไว้เพื่ออนุญาตให้แอปพลิเคชั่นในอดีตที่ใช้งานได้โดยไม่ต้องแก้ไขgrep -Efgrepgrep -Fegrepfgrep

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


ใช้grep -Eแทนegrepรับประกันคำตอบที่ซ้ำกัน?
แม็กเคเล็บ

@Caleb ฉันไม่เห็นว่าทำไม มีมากกว่าหนึ่งวิธีในการสกินแมวและไซต์นี้อนุญาตให้สามารถแสดงรายการทั้งหมดได้
DTest

1
ใช่ แต่มันเป็นเพียงการเชื่อมโยงซึ่งกันและกันไม่ใช่สองโปรแกรมที่แตกต่างกันซึ่งมีการทำงานทับซ้อนกัน ดังนั้นจะไม่เป็นส่วนเพิ่มเติมของ 'ภาคผนวก' (อ่าน: ความคิดเห็น) ไม่ใช่คำตอบที่เต็มเปี่ยม? ฉันเคย downvotes สำหรับความผิดน้อย ...
Marcin

@ การทดสอบ: ตามสิทธิ์dmourati ที่จริงฉันตีหมัดสองสามวินาทีและแม้ว่าเขาจะไม่ได้อธิบายเหตุผลที่เขาสมควรได้รับเครดิตบางส่วนที่นี่ คุณมาสายไปงานปาร์ตี้อย่างชัดเจนเพราะเราทั้งคู่มี upvotes อย่างน้อยสองตัวก่อนที่คุณจะเข้ามาการเปลี่ยนไวยากรณ์จากไบนารี symlinked เป็นอาร์กิวเมนต์มักเป็นสิ่งที่คุณจะใช้แสดงความคิดเห็นไม่ใช่คำตอบแยกต่างหาก หากคุณต้องการผิวแมวที่แตกต่างกันใช้sed, awk, perl, หรือmultitail ninja_foo
Caleb

1
@DTest: ฉันใช้เสรีภาพในการแก้ไขคำอธิบายของคุณเพื่อเพิ่มแหล่งข้อมูลต้นฉบับ ดูเหมือนว่า -E ขอแนะนำสำหรับการใช้งานในอนาคตดังนั้นฉันจึงทำเครื่องหมายว่า แต่ลบบันทึกย่อของคุณเกี่ยวกับ distros ที่ไม่มี egrep distros lain ที่กล่าวถึงมี egrep เป็นเพียงไบนารีแยกต่างหากแทนที่จะเป็น symlink
Caleb

21

ลอง piping เพื่อ egrep ด้วยรายการคำที่คุณต้องการกรอง:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

โปรดทราบว่าการใช้วงเล็บรอบรายการที่ตรงกันเป็นตัวเลือก เนื่องจาก|จะถือว่าเป็นตัวดำเนินการตรรกะหรือโดย grep ไม่ว่าจะเกิดขึ้นเป็นส่วนหนึ่งของกลุ่มย่อยหรือไม่ '(ELB|Pingdom|Health)'จะทำงานเหมือนกันทุกประการ สำหรับบางคนไวยากรณ์อาจชัดเจนกว่า ฉันพบว่าพิมพ์ได้ง่ายขึ้นโดยที่ฉันไม่สามารถสลับจากการจับคู่เดี่ยวไปเป็นรายการการแข่งขันที่เป็นไปได้โดยไม่ต้องย้อนกลับเพื่อเพิ่มวงเล็บ

สำหรับเครดิตพิเศษมันเป็นมูลค่าการกล่าวขวัญที่multitailทำนินจา foo เมื่อมันมาถึงการกรองเอาท์พุท ตัวอย่างเช่นคุณสามารถกรองคำของคุณเช่นนี้:

multitail -e ELB -e Pingdom -e Health -f log_file

คุณสามารถใช้สีหรือไฮไลต์เอาท์พุทแทนการกรองได้

แก้ไข:ดูคำตอบ DTestsและแสดงความคิดเห็นสำหรับคำอธิบายที่เต็มรูปแบบของวิธีการ egrep grep -Eเป็นเพียงวิธีอื่นเลิกปิดไฟ


2
ไม่ควรแสดงออกด้วย (') ไม่ควรใช้กับ (")?
bbaja42

ใช่ขอบคุณนั่นเป็นตัวพิมพ์ผิด สำหรับการอ้างอิงในอนาคตเนื่องจากไซต์แลกเปลี่ยนแลกเปลี่ยนทำงานเหมือนวิกินั่นเป็นสิ่งที่คุณสามารถแก้ไขได้
Caleb

ฉันคิดว่าการแก้ไขจะต้องมีมากกว่า 6 ตัวอักษร?
Sirex

หากคุณไม่มีตัวแทนจำหน่ายที่สูงใช่มีจำนวนอักขระขั้นต่ำ 6 ตัว แต่ในกรณีนี้อักขระ 1 ตัวมีความสำคัญอย่างยิ่ง คุณสามารถบังคับให้มีการเปลี่ยนแปลงได้โดยเพิ่มความคิดเห็น HTML ลงในเนื้อความ ตัวละครจะนับรวมอยู่ในขีด จำกัด และคุณสามารถสังเกตได้ว่าทำไมคุณถึงเปลี่ยนแปลง
Caleb

@Caleb ขอบคุณมากสำหรับคำแนะนำ multitail มันเป็นที่น่ากลัว !! ไม่อยากจะเชื่อเลยว่าฉันจะต้องใช้เวลานานในชีวิตหากปราศจากมัน
sidewinderguy


3

ทำไมคุณต้องการบันทึกข้อมูลนี้

  • มันเป็นเรื่องที่เก็บถาวรหรือไม่?
  • คุณต้องการรันสคริปต์ที่แตกต่างกันตามเงื่อนไขโดยขึ้นอยู่กับคำหลักหรือรูปแบบที่แตกต่างกันในไฟล์บันทึกหรือไม่?

หากคุณต้องการมีพฤติกรรมแบบสคริปต์ขึ้นอยู่กับเนื้อหาของไฟล์บันทึกคุณอาจต้องการทำการกรองโดยใช้ความคาดหวัง ( http://en.wikipedia.org/wiki/Expect ) Expect เป็นส่วนขยาย Tcl แต่ก็มีรุ่น Python เช่นกัน

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

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

ดังนั้นคุณระบุรูปแบบในข้อความคาดการณ์และคุณระบุลักษณะการทำงานที่แตกต่างกันและคุณสามารถรวมสิ่งทั้งหมดไว้ในลูปและคุณสามารถเขียนตัวกรองที่ทรงพลังมากซึ่งเขียนส่วนของอินพุตของคุณไปยังไฟล์ต่าง ๆ หรือดำเนินการและเรียกใช้สคริปต์อื่น ๆ ขึ้นอยู่กับสิ่งที่อยู่ในข้อมูลของคุณ

ดังนั้นทำไมคุณถึงพยายามกรองไฟล์บันทึกของคุณเพื่อดำเนินการกับอินพุตไฟล์หรือเพื่อเหตุผลในการเก็บถาวร


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