วิธี grep ไฟล์บันทึกภายในช่วงเวลาที่กำหนด


22

ฉันมีไฟล์บันทึกแต่ละบรรทัดในบันทึกจะมีวันที่เตรียมดังนี้:

2012-03-06 11:34:48,657 blah blah blah...

ฉันจะgrepไฟล์นี้และรับเฉพาะสายจาก 08:00 ถึง 23:00 เท่านั้นได้อย่างไร

ความตั้งใจของฉันคือฉันต้องการนับจำนวนข้อผิดพลาดที่เกิดขึ้นภายใน 8.00 น. ถึง 23.00 น.

คำตอบ:


24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

คำอธิบายโดยละเอียดสามารถพบได้ในบทช่วยสอนregex (นิพจน์ทั่วไป); egrepใช้ไวยากรณ์ "POSIX เพิ่มเติม" ( man 7 regex)

  • แรก^หมายถึง "เริ่มต้นของบรรทัด"

  • [^ ]+ เพียงตรงกับฟิลด์วันที่โดยไม่คำนึงถึงวันที่จริง

    • [...]หมายถึง "ตัวละครใด ๆ ระหว่างวงเล็บ" ดังนั้น[89]จะจับคู่อย่างใดอย่างหนึ่ง8หรือ9; [0-9]เป็นตัวเลขใด ๆ และ[^ ]เป็นอะไรก็ได้ยกเว้นเว้นวรรค (เพราะ^เครื่องหมายวงเล็บด้านใน)

    • +หมายถึง "หนึ่งหรือมากกว่าของก่อนหน้านี้" (ตัวอย่างเช่นa+จะตรงกับa, aaaและaaaaaaaa)

    • ดังนั้น^[^ ]+จะเริ่มต้นด้วยจุดเริ่มต้นของบรรทัดและจับคู่อักขระที่ไม่ใช่ช่องว่างให้มากที่สุด

  • (...|...|...)หมายถึง "รูปแบบที่กำหนดอย่างใดอย่างหนึ่ง" ดังนั้น(0[89]|1[0-9]|2[012])หมายถึง "อย่างใดอย่างหนึ่ง0[89]หรือ1[0-9]หรือ2[012]" จะจับคู่หมายเลขทั้งหมดตั้งแต่ 08 ถึง 22


ตัวเลือกที่ค่อนข้างดีกว่าคือ:

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

-Fตัวเลือกแยกบรรทัดลงในช่องที่แยกจากกันทุกคนตาม[: ]regex (การจับคู่อย่างใดอย่างหนึ่ง:หรือพื้นที่) และawkตรวจสอบสคริปต์ที่คอลัมน์ 2 (ชั่วโมง)


สวัสดีมันใช้งานได้ แต่คุณสามารถเพิ่มคำอธิบายเล็ก ๆ น้อย ๆ ว่ามันทำงานอย่างไร ฉันไม่ได้รับ^[^ ]+ส่วน ..
Rosdi

20

ทำไมต้องใช้ grep? คุณสามารถใช้ sed

ตัวอย่าง:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

นี่จะพิมพ์บันทึกทั้งหมดระหว่างJune 17 13:39:54และJune 18 10:50:28


1
ฉันคิดว่า OP ต้องการบันทึกทั้งหมดระหว่าง 8.00 น. ถึง 23.00 น. เพียงแค่บันทึกจากวันที่กำหนด
Dennis

1
เขาสามารถทำเช่นนั้นได้ เช่น: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G

1
พิมพ์ดีดที่น่ารังเกียจ ฉันหมายถึง: ไม่ใช่ของจากวันที่กำหนด
Dennis

2
ปัญหาของวิธีนี้คือจะต้องมีบรรทัดในไฟล์บันทึกที่มีการประทับเวลานั้น ในตัวอย่างข้างต้นหากไม่มีบรรทัดที่มีการประทับเวลา 2012-03-06 11:34:48 แล้วไม่มีอะไรจะพิมพ์ออกมา วิธี awk ด้านบนจะทำงานในกรณีดังกล่าว (เช่นคุณต้องการบันทึกทั้งหมดที่มีชั่วโมงระหว่าง 8 และ 11 แต่คุณไม่ทราบว่ามีรายการบันทึกในเวลา 2012-03-06 08:00:00 หรืออะไรก็ตาม ชั่วโมงเลย)
user650654

0

จริงๆแล้วมีวิธีการทำเช่นนี้ได้ง่ายกว่ามาก

ดาวน์โหลด / เอกสาร: autodrgrep.kl.sh

คำสั่ง:

./autodrgrep.kl.sh   notchef   /tmp/client.log   '2016-05-08_08:00:00,2016-05-08_23:00:00'   'INFO'   'a2ensite'   5  10  -show

คำอธิบาย:

  • autodrgrep.kl.sh เป็นชื่อเครื่องมือ

  • notchef เป็นตัวเลือกที่ส่งผ่านไปยังเครื่องมือเพื่อบอกว่าจะต้องทำอย่างไร ในกรณีนี้มันบอกเครื่องมือชนิดของไฟล์บันทึก /tmp/client.log

  • /tmp/client.log เป็นไฟล์บันทึกแน่นอน

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 คือช่วงของวันที่จากภายในบันทึกที่คุณต้องการสแกน

  • "INFO" เป็นหนึ่งในสตริงที่อยู่ในรายการบันทึกที่คุณสนใจ

  • "a2ensite" เป็นสตริงอื่นในบรรทัดเดียวกันกับที่คุณคาดว่าจะพบสตริง "INFO" การระบุทั้งสองสตริง (INFO และ a2ensite) แยกและประมวลผลบรรทัดที่คุณต้องการเร็วขึ้นโดยเฉพาะอย่างยิ่งถ้าคุณกำลังจัดการกับไฟล์บันทึกขนาดใหญ่

  • 5 ระบุคำเตือน เมื่อระบุ 5 คุณจะบอกให้โปรแกรมแจ้งเตือนเป็นคำเตือนหากมีสตริงการค้นหาอย่างน้อย 5 รายการที่คุณระบุ

  • 10 ระบุว่าสำคัญ ด้วยการระบุ 10 คุณจะบอกให้โปรแกรมแจ้งเตือนว่าสำคัญยิ่งหากมีสตริงการค้นหาอย่างน้อย 10 ครั้งที่คุณระบุ

  • - แสดงประเภทการตอบกลับที่คุณจะได้รับ โดยการระบุ -shown คุณกำลังพูดว่าหากพบสิ่งใดที่ตรงกับรูปแบบที่ระบุเอาท์พุทไปยังหน้าจอ

วิ่งตัวอย่าง:

# ./autodrgrep.kl.sh notchef  /tmp/client.log   '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite'  5  10  -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

เกิดอะไรขึ้นถ้าช่วงวันที่หรือช่วงเวลาที่ผู้ใช้ระบุไม่ได้อยู่ในบันทึก

การรันคำสั่งด้านบนแต่ละครั้งจะมีบรรทัด (บรรทัดสุดท้ายของเอาต์พุต) ที่ระบุว่า "ATWFILF" หรือ "ETWNFILF" เสมอ

  • ATWFILF หมายความว่าช่วงวันที่หรือช่วงเวลาที่คุณต้องการค้นหาถูกพบในบันทึก ดังนั้นนี่เป็นสิ่งที่ดีมาก

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

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