2012-06-21 10:54:47 +0000 2012-06-21 10:54:47 +0000
22
22

Hoe een logbestand binnen een bepaalde tijd te grep'en

Ik heb een logbestand, elke regel in het logbestand is voorafgegaan door een datum, zoals dit:

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

Hoe kan ik dit bestand grep en alleen de regels van 8 uur ‘s morgens tot 11 uur ’s avonds krijgen?

Mijn bedoeling is om het aantal fouten te tellen van 8 uur ’s morgens tot 11 uur ’s avonds.

Antwoorden (3)

24
24
24
2012-06-21 11:08:20 +0000
egrep '^[^]+ (0[89]|1[0-9]|2[012]):'

Gedetailleerde uitleg is te vinden in diverse regex (reguliere expressie) tutorials; egrep gebruikt “POSIX extended” syntax (man 7 regex).

  • De eerste ^ betekent “begin van de regel”.

  • [^]+ komt alleen overeen met het datumveld, ongeacht de eigenlijke datum.

  • (...|...|...) betekent “een van de gegeven patronen”, dus (0[89]|1[0-9]|2[012]) betekent “ofwel 0[89] of 1[0-9] of 2[012]”. Het zal overeenkomen met alle getallen van 08 tot 22.

Een iets betere optie is:

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

De -F optie splitst elke regel in aparte velden volgens de [:] regex (overeenkomend met ofwel : of een spatie), en het awk script controleert de 2e kolom (het uur).

21
21
21
2012-06-21 11:11:02 +0000

Waarom zou je grep gebruiken? Je kunt gewoon sed gebruiken.

voorbeeld:

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

Hiermee print je alle logs tussen June 17 13:39:54 en June 18 10:50:28

0
0
0
2016-05-09 06:43:49 +0000

Er is eigenlijk een veel gemakkelijkere manier om dit te doen.

Download/Documentatie: autodrgrep.kl.sh

Commando:

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

Uitleg:

  • autodrgrep.kl.sh is de naam van het programma.

  • notchef is een optie die aan het gereedschap wordt doorgegeven om het te vertellen wat het moet doen. In dit geval wordt verteld wat voor soort logbestand /tmp/client.log is.

  • /tmp/client.log is natuurlijk het logbestand.

  • 2016-05-08:19:12:00,2016-05-08:21:13:00 is het bereik van de datum in het log dat je wilt scannen

  • “INFO” is een van de strings die in de regels van de logs staan waarin je geïnteresseerd bent.

  • “a2ensite” is een andere string op dezelfde regel waar je de “INFO” string op verwacht te vinden. Het specificeren van deze twee strings (INFO en a2ensite) isoleert en verwerkt de regels die je wilt hebben een stuk sneller, vooral als je te maken hebt met een enorm logbestand.

  • 5 specificeert Waarschuwing. Met 5 geef je aan dat het programma een WAARSCHUWING moet geven als de opgegeven zoektermen minstens 5 keer voorkomen.

  • 10 geeft Critical aan. Door 10 op te geven, laat je het programma waarschuwen als CRITISCH als de opgegeven zoektermen ten minste 10 keer voorkomen.

  • -show geeft aan wat voor soort reactie je krijgt. Door -shown te specificeren, zeg je dat als er iets gevonden wordt dat overeenkomt met de gespecificeerde patronen, er uitvoer naar het scherm komt.

Steekproefrun:

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

*Wat als het door de gebruiker opgegeven datumbereik of tijdsbestek niet in het logboek staat? *

Elke run van bovenstaand commando heeft altijd een regel (laatste regel van de uitvoer) met de tekst “ATWFILF” of “ETWNFILF”.

  • ATWFILF betekent dat het door u gezochte datumbereik of tijdskader in het log is gevonden. Dit is dus heel goed.

  • ETWNFILF betekent dat het huidige datumbereik of het huidige tijdsbestek waarnaar u vroeg NIET in het logboek is gevonden. In dit geval zal de tijd die het dichtst bij de door u opgegeven tijd ligt worden opgespoord en gebruikt.