Belirli bir süre içinde bir günlük dosyasını grep


22

Bir günlük dosyasına sahibim, günlükteki her satır bunun gibi bir tarihe hazırlanır:

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

grepBu dosyayı nasıl alabilirim ve yalnızca sabah 8'den akşam 11'e kadar olan satırları alırım?

Niyetim, sabah 8 ile akşam 11 arasında gerçekleşen hata sayısını saymak istiyorum.

Yanıtlar:


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

Detaylı açıklama çeşitli regex (düzenli ifade) derslerinde bulunabilir; egrep"POSIX genişletilmiş" sözdizimini ( man 7 regex) kullanır.

  • İlki ^"satırın başlangıcı" anlamına gelir.

  • [^ ]+ Sadece gerçek tarih ne olursa olsun tarih alanı ile eşleşir.

    • [...]aracı "parantez içinde herhangi bir karakter", yani [89], ya eşleşir 8veya 9; [0-9]herhangi bir sayıdır ve bir boşluk dışında[^ ] herhangi bir şeydir ( iç braketler nedeniyle ).^

    • +araçlar "bir ya da daha fazla önceki bir" (örneğin, a+eşleşecektir a, aaave aaaaaaaa).

    • Böylece ^[^ ]+satırın başlangıcı ile başlayacak ve olabildiğince fazla boşluk içermeyen karakterlerle eşleşecektir.

  • (...|...|...)"verilen modellerden biri" (0[89]|1[0-9]|2[012])anlamına gelir, "ya da 0[89]ya 1[0-9]da 2[012]" anlamına gelir . 08 - 22 arasındaki tüm sayılarla eşleşecek.


Biraz daha iyi bir seçenek:

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

-FSeçenek göre ayrı alanlara her satırını böler [: ]regex (eşleştirme ya :veya boşluk) ve awk komut kontrolleri 2 sütun (saat).


Merhaba, işe yarıyor .. ama nasıl çalıştığını biraz açıklayabilir misiniz? ^[^ ]+
Rolü

20

Neden grep kullanıyorsunuz? Sadece sed kullanabilirsiniz.

örnek:

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

Bu June 17 13:39:54ve arasındaki tüm günlükleri yazdıracakJune 18 10:50:28


1
OP'nin sabah 8 ile akşam 11 arasında tüm kayıtları istediğini düşünüyorum.
Dennis,

1
Bunu da yapabilir. Eg: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G

1
Pis yazım hatası. Demek: değil belirli bir güne gelen robotlar.
Dennis,

2
Bu yaklaşımla ilgili sorun, günlük dosyasında bu zaman damgasına sahip bir satır olması gerektiğidir. Yukarıdaki örnekte, 2012-03-06 11:34:48 zaman damgasına sahip bir satır yoksa, hiçbir şey yazdırılmaz. Yukarıdaki awk yaklaşımı bu gibi durumlarda işe yarayabilir (yani saat 8 ila 11 arasında olan tüm günlükleri istersiniz, ancak 2012-03-06 08:00:00 saatleri arasında bir günlük girişi olup olmadığını bilmiyorsunuz. hiç bir saat).
user650654

0

Bunu yapmanın çok daha kolay bir yolu var.

İndirme / Dökümantasyon: autodrgrep.kl.sh

Komut:

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

Açıklama:

  • autodrgrep.kl.sh aracın adıdır.

  • notchef, ne yapması gerektiğini bildirmek için araca geçirilen bir seçenektir. Bu özel durumda, araca /tmp/client.log dosyasının ne tür bir günlük dosyası olduğunu söyler.

  • /tmp/client.log elbette günlük dosyasıdır.

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00, taramak istediğiniz günlükteki tarih aralığı

  • "BİLGİ", ilgilendiğiniz günlük satırlarında bulunan dizelerden biridir.

  • "a2ensite", "INFO" dizesini bulmayı beklediğiniz satırın aynı satırında başka bir dizedir. Bu iki dizenin belirtilmesi (INFO ve a2ensite), özellikle çok büyük bir günlük dosyasıyla uğraşıyorsanız, daha çok istediğiniz satırları ayırır ve işler.

  • 5, Uyarı'yı ​​belirtir. 5 belirterek, belirttiğiniz arama dizelerinin en az 5 örneği varsa, programa UYARI olarak uyarmasını söylersiniz.

  • 10, Kritik'i belirtir. 10 belirterek, belirttiğiniz arama dizelerinin en az 10 tanesi varsa, programa KRİTİK olarak uyarmasını söylersiniz.

  • -show ne tür bir cevap alacağınızı belirtir. -Shown'u belirterek, belirtilen kalıplarla eşleşen bir şey bulunup bulunmadığını, ekrana çıktısını söyleyin.

Örnek çalışma:

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

Kullanıcı belirtilen tarih aralığı veya zaman dilimi günlükte değilse ne olur?

Yukarıdaki komutun her çalışması daima "ATWFILF" veya "ETWNFILF" yazan bir satıra (çıktının son satırı) sahip olacaktır.

  • ATWFILF, aranmasını istediğiniz gerçek tarih aralığının veya zaman çerçevesinin kayıt defterinde bulunduğu anlamına gelir. Yani bu çok iyi.

  • ETWNFILF, aranmasını istediğiniz gerçek tarih aralığını veya zaman çerçevesini kayıt defterinde bulunamadı. Bu durumda, belirttiğiniz zamana en yakın zaman tespit edilir ve bunun yerine kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.