Cách grep một tệp nhật ký trong một khoảng thời gian cụ thể


22

Tôi có một tệp nhật ký, mỗi dòng trong nhật ký được thêm vào một ngày, như vậy:

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

Làm thế nào để tôi greptập tin này và chỉ nhận được các dòng từ 8 giờ sáng đến 11 giờ tối?

Ý định của tôi là tôi muốn đếm số lỗi xảy ra trong vòng 8 giờ sáng đến 11 giờ tối.

Câu trả lời:


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

Giải thích chi tiết có thể được tìm thấy trong các hướng dẫn regex (biểu thức chính quy) khác nhau ; egrepsử dụng cú pháp "POSIX mở rộng" ( man 7 regex).

  • Đầu tiên ^có nghĩa là "bắt đầu của dòng".

  • [^ ]+ chỉ phù hợp với trường ngày, bất kể ngày thực tế.

    • [...]có nghĩa là "bất kỳ ký tự nào giữa các dấu ngoặc", vì vậy [89]sẽ khớp với 8hoặc 9; [0-9]là bất kỳ số nào và [^ ]là bất cứ thứ gì ngoại trừ khoảng trắng (vì ^dấu ngoặc trong).

    • +có nghĩa là "một hoặc nhiều của trước" (ví dụ, a+sẽ phù hợp a, aaaaaaaaaaa).

    • Vì vậy, ^[^ ]+sẽ bắt đầu với phần đầu của dòng và khớp với càng nhiều ký tự không phải không gian càng tốt.

  • (...|...|...)có nghĩa là "một trong các mẫu đã cho", vì vậy (0[89]|1[0-9]|2[012])có nghĩa là " 0[89]hoặc 1[0-9]hoặc 2[012]". Nó sẽ phù hợp với tất cả các số từ 08 đến 22.


Một lựa chọn tốt hơn là:

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

Các -Ftùy chọn chia mỗi dòng vào các lĩnh vực riêng biệt theo [: ]regex (phù hợp với một trong hai :hoặc một không gian), và awk kiểm tra kịch bản cột thứ 2 (giờ).


Xin chào, nó hoạt động .. nhưng bạn có thể thêm một chút giải thích làm thế nào nó hoạt động? Tôi không nhận được ^[^ ]+phần ..
Rosdi

20

Tại sao phải sử dụng grep? Bạn chỉ có thể sử dụng sed.

thí dụ:

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

Điều này sẽ in tất cả các bản ghi giữa June 17 13:39:54June 18 10:50:28


1
Tôi nghĩ rằng OP muốn tất cả các bản ghi trong khoảng thời gian từ 8 giờ sáng đến 11 giờ tối, bot chỉ là những bản ghi từ một ngày cụ thể.
Dennis

1
Anh ấy cũng có thể làm điều đó. Ví dụ: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G

1
Lỗi đánh máy Ý tôi là: không phải những người từ một ngày cụ thể.
Dennis

2
Vấn đề với cách tiếp cận này là phải có một dòng trong tệp nhật ký với dấu thời gian đó. Trong ví dụ trên, nếu không có dòng nào có dấu thời gian 2012 / 03-06 11:34:48, thì không có gì sẽ in ra. Cách tiếp cận awk ở trên sẽ hoạt động cho các trường hợp như vậy (nghĩa là bạn muốn tất cả các bản ghi có giờ trong khoảng từ 8 đến 11, nhưng bạn không biết liệu có một mục nhật ký nào vào thời điểm 2012 / 03-06 08:00:00 hay bất cứ điều gì cho điều đó không giờ nào cả).
dùng650654

0

Thực sự có một cách dễ dàng hơn nhiều để làm điều này.

Tải xuống / Tài liệu: autodrgrep.kl.sh

Chỉ huy:

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

Giải trình:

  • autodrgrep.kl.sh là tên công cụ.

  • notchef là một tùy chọn được truyền cho công cụ để cho nó biết phải làm gì. Trong trường hợp cụ thể này, nó đang báo cho công cụ biết loại tệp nhật ký /tmp/client.log là gì.

  • /tmp/client.log dĩ nhiên là tệp nhật ký.

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 là phạm vi ngày từ trong nhật ký mà bạn muốn quét

  • "INFO" là một trong những chuỗi nằm trong dòng nhật ký mà bạn quan tâm.

  • "a2ensite" là một chuỗi khác trên cùng một dòng mà bạn mong đợi để tìm chuỗi "INFO" trên. Chỉ định hai chuỗi này (INFO và a2ensite) cô lập và xử lý các dòng bạn muốn nhanh hơn rất nhiều, đặc biệt nếu bạn đang xử lý một tệp nhật ký lớn.

  • 5 chỉ định Cảnh báo. Bằng cách chỉ định 5, bạn đang bảo chương trình cảnh báo là CẢNH BÁO nếu có ít nhất 5 lần xuất hiện của chuỗi tìm kiếm mà bạn đã chỉ định

  • 10 chỉ định quan trọng. Bằng cách chỉ định 10, bạn đang nói với chương trình cảnh báo là TIÊU CHUẨN nếu có ít nhất 10 lần xuất hiện của chuỗi tìm kiếm mà bạn đã chỉ định.

  • -hiển thị chỉ định loại phản hồi bạn sẽ nhận được. Bằng cách chỉ định -shown, bạn đang nói nếu tìm thấy bất cứ thứ gì phù hợp với các mẫu được chỉ định, xuất ra màn hình.

Chạy mẫu:

# ./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

Điều gì xảy ra nếu người dùng chỉ định phạm vi ngày hoặc khung thời gian không có trong nhật ký?

Mỗi lần chạy lệnh trên sẽ luôn có một dòng (dòng cuối cùng của đầu ra) có nội dung "ATWFILF" hoặc "ETWNFILF".

  • ATWFILF có nghĩa là phạm vi ngày hoặc khung thời gian thực tế bạn yêu cầu tìm kiếm đã được tìm thấy trong nhật ký. Vì vậy, điều này là rất tốt.

  • ETWNFILF có nghĩa là phạm vi ngày hoặc khung thời gian thực tế bạn yêu cầu tìm kiếm KHÔNG được tìm thấy trong nhật ký. Trong trường hợp này, thời gian gần nhất với thời gian bạn chỉ định sẽ được phát hiện và sử dụng thay thế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.