ฉันต้องการtail -f
บันทึกของฉัน อย่างไรก็ตามฉันต้องการกรองทุกอย่างที่มีคำว่า:
"ELB", "Pingdom", "Health"
ฉันต้องการtail -f
บันทึกของฉัน อย่างไรก็ตามฉันต้องการกรองทุกอย่างที่มีคำว่า:
"ELB", "Pingdom", "Health"
คำตอบ:
ฉันไม่รู้เกี่ยวกับการใช้ 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 -E
fgrep
grep -F
egrep
fgrep
เนื่องจากมันเป็นคำสั่งที่มีความหมายเหมือนกันมันจึงเกิดความพึงพอใจถ้าคุณไม่มี egrep เลย อย่างไรก็ตามสำหรับความเข้ากันได้ไปข้างหน้าขอแนะนำให้ใช้grep -E
ไวยากรณ์เนื่องจากวิธีการอื่นจะเลิกอย่างเป็นทางการ
grep -E
แทนegrep
รับประกันคำตอบที่ซ้ำกัน?
sed
, awk
, perl
, หรือmultitail
ninja_foo
ลอง 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
เป็นเพียงวิธีอื่นเลิกปิดไฟ
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
ทำไมคุณต้องการบันทึกข้อมูลนี้
หากคุณต้องการมีพฤติกรรมแบบสคริปต์ขึ้นอยู่กับเนื้อหาของไฟล์บันทึกคุณอาจต้องการทำการกรองโดยใช้ความคาดหวัง ( 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
}
}
ดังนั้นคุณระบุรูปแบบในข้อความคาดการณ์และคุณระบุลักษณะการทำงานที่แตกต่างกันและคุณสามารถรวมสิ่งทั้งหมดไว้ในลูปและคุณสามารถเขียนตัวกรองที่ทรงพลังมากซึ่งเขียนส่วนของอินพุตของคุณไปยังไฟล์ต่าง ๆ หรือดำเนินการและเรียกใช้สคริปต์อื่น ๆ ขึ้นอยู่กับสิ่งที่อยู่ในข้อมูลของคุณ
ดังนั้นทำไมคุณถึงพยายามกรองไฟล์บันทึกของคุณเพื่อดำเนินการกับอินพุตไฟล์หรือเพื่อเหตุผลในการเก็บถาวร