Come eseguire il grep di un file di registro in un periodo di tempo specifico


22

Ho un file di registro, ogni riga nel registro è anteposta con una data, in questo modo:

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

Come faccio a grepottenere questo file e ottenere solo le linee dalle 8:00 alle 23:00?

La mia intenzione è quella di voler contare il numero di errori che si verificano entro le 8:00 alle 23:00.

Risposte:


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

Una spiegazione dettagliata può essere trovata in vari tutorial regex (espressione regolare); egreputilizza la sintassi "POSIX extended" ( man 7 regex).

  • Il primo ^significa "inizio della linea".

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

    • [...]significa "qualsiasi carattere tra parentesi", quindi [89]corrisponderà a 8o 9; [0-9]è un numero qualsiasi ed [^ ]è qualsiasi cosa tranne uno spazio (a causa delle ^parentesi interne).

    • +significa "uno o più dei precedenti" (per esempio, a+potrebbe corrispondere a, aaae aaaaaaaa).

    • Quindi ^[^ ]+inizierà con l'inizio della riga e corrisponderà al maggior numero possibile di caratteri non spaziali.

  • (...|...|...)significa "uno dei modelli dati", quindi (0[89]|1[0-9]|2[012])significa "o 0[89]o 1[0-9]o 2[012]". Abbinerà tutti i numeri dalle 08 alle 22.


Un'opzione leggermente migliore è:

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

L' -Fopzione divide ogni riga in campi separati in base alla [: ]regex (corrispondente a uno :o uno spazio) e lo script awk controlla la seconda colonna (l'ora).


Ciao, funziona .. ma puoi aggiungere una piccola spiegazione su come funziona? Non capisco la ^[^ ]+parte ..
Rosdi,

20

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

esempio:

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

Ciò stamperà tutti i registri tra June 17 13:39:54eJune 18 10:50:28


1
Penso che l'OP voglia tutti i log tra le 8:00 e le 23:00, solo quelli di un giorno specifico.
Dennis,

1
Anche lui può farlo. Ad esempio: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G

1
Errore di battitura. Intendevo: non quelli di un giorno specifico.
Dennis,

2
Il problema con questo approccio è che ci deve essere una riga nel file di registro con quel timestamp. Nell'esempio sopra, se non c'è una riga con il timestamp 2012-03-06 11:34:48, allora non verrà stampato nulla. L'approccio awk sopra funzionerebbe in questi casi (ad esempio, vuoi tutti i registri con ora tra le 8 e le 11, ma non sai se al momento è disponibile una voce di registro 2012-03-06 08:00:00 o altro per quello ora a tutti).
user650654

0

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, indica allo strumento che tipo di file di registro /tmp/client.log è.

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

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 è l'intervallo di date all'interno del registro che si desidera scansionare

  • "INFO" è una delle stringhe presenti nelle righe dei registri a cui sei interessato.

  • "a2ensite" è un'altra stringa sulla stessa riga su cui ti aspetti di trovare la stringa "INFO". Specificare queste due stringhe (INFO e a2ensite) isola ed elabora le linee desiderate molto più rapidamente, in particolare se si ha a che fare con un file di registro enorme.

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

  • 10 specifica Critico. 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 quale tipo di risposta otterrai. 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

Cosa succede se l'intervallo di date specificato dall'utente o l'intervallo di tempo non è nel registro?

Ogni esecuzione del comando precedente avrà sempre una riga (ultima riga dell'output) che dice "ATWFILF" o "ETWNFILF".

  • ATWFILF significa che nel registro è stato trovato l'intervallo di date effettivo o l'intervallo di tempo richiesto per la ricerca. Quindi va molto bene.

  • ETWNFILF indica che l'intervallo di date o l'intervallo di tempo effettivi richiesti non sono stati trovati nel registro. In questo caso, verrà invece rilevato e utilizzato il tempo più vicino all'ora specificata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.