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

Come fare il grep di un file di log in un periodo di tempo specifico

Ho un file di log, ogni linea nel log è preceduta da una data, così:

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

Come faccio a grep questo file e ottenere solo le linee dalle 8 alle 23?

La mia intenzione è quella di contare il numero di errori che si verificano tra le 8 del mattino e le 11 di sera.

Risposte (3)

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

Una spiegazione dettagliata può essere trovata in vari tutorial regex (espressione regolare); egrep usa la sintassi “POSIX estesa” (man 7 regex).

  • Il primo ^ significa “inizio della linea”.

  • [^]+ corrisponde solo al campo della data, indipendentemente dalla data effettiva.

  • (...|...|...) significa “uno dei due modelli dati”, quindi (0[89]|1[0-9]|2[012]) significa “o 0[89] o 1[0-9] o 2[012]”. Corrisponderà a tutti i numeri da 08 a 22.


Un'opzione un po’ migliore è:

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

L'opzione -F divide ogni linea in campi separati secondo la regex [:] (che corrisponde a : o a uno spazio), e lo script awk controlla la seconda colonna (l'ora).

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

Perché preoccuparsi di usare grep? Potete semplicemente usare sed.

esempio:

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

Questo stamperà tutti i log tra June 17 13:39:54 e June 18 10:50:28

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

In realtà c'è un modo molto più semplice per farlo.

Download/Documentazione: autodrgrep.kl.sh

Comando:

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

Spiegazione:

  • autodrgrep.kl.sh è il nome dello strumento.

  • notchef è un'opzione che viene passata allo strumento per dirgli cosa fare. In questo caso particolare, sta dicendo allo strumento che tipo di file di log /tmp/client.log è.

  • /tmp/client.log è ovviamente il file di log.

  • 2016-05-08_19:12:00,2016-05-08\21:13:00 è l'intervallo di date all'interno del log che vuoi analizzare

  • “INFO” è una delle stringhe che si trova nelle righe di log che ti interessano.

  • “a2ensite” è un'altra stringa sulla stessa linea in cui ti aspetti di trovare la stringa “INFO”. Specificando queste due stringhe (INFO e a2ensite) si isolano ed elaborano le linee che si desidera molto più velocemente, in particolare se si ha a che fare con un file di log enorme.

  • 5 specifica Warning. Specificando 5, stai dicendo al programma di avvisare come WARNING se ci sono almeno 5 occorrenze delle stringhe di ricerca che hai specificato

  • 10 specifica Critical. Specificando 10, stai dicendo al programma di avvisare come CRITICO se ci sono almeno 10 occorrenze delle stringhe di ricerca che hai specificato.

  • -show specifica che tipo di risposta otterrete. Specificando -shown, stai dicendo che se viene trovato qualcosa che corrisponde ai modelli specificati, l'output sullo schermo.

Esecuzione di esempio:

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

**Che cosa succede se l'intervallo di date o il lasso di tempo specificato dall'utente non è nel registro?

Ogni esecuzione del comando di cui sopra avrà sempre una riga (l'ultima dell'output) che dice o “ATWFILF” o “ETWNFILF”.

  • ATWFILF significa che l'effettivo intervallo di date o l'intervallo di tempo che avete richiesto è stato trovato nel registro. Quindi questo è molto buono.

  • ETWNFILF significa che l'intervallo di date o il lasso di tempo che hai richiesto non è stato trovato nel registro. In questo caso, il tempo più vicino al tempo che hai specificato sarà rilevato e usato al suo posto.