Comment grep un fichier journal dans une période de temps spécifique

J'ai un fichier journal, chaque ligne dans le journal est préférable à une date, de la manière suivante:

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

Comment puis-je grep ce fichier et obtenir uniquement les lignes de 8h à 11h seulement?

Mon intention est que je compte compter le nombre d'erreurs entre 8 heures et 11 heures.

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

Des explications détaillées peuvent être trouvées dans différents didacticiels regex (expression régulière); egrep utilise la egrep "POSIX extended" ( man 7 regex ).

  • Le premier ^ signifie "début de la ligne".

  • [^ ]+ juste au champ de la date, quelle que soit la date réelle.

    • [...] signifie "tout caractère entre les parenthèses", donc [89] correspond à 8 ou 9 ; [0-9] est n'importe quel nombre, et [^ ] est n'importe quoi sauf un espace (en raison des ^ parents intérieurs).

    • + Signifie "un ou plusieurs des précédents" (par exemple, a+ correspond à a , aaa et aaaaaaaa ).

    • Alors ^[^ ]+ commencera avec le début de la ligne et associe autant de caractères non-espace que possible.

  • (...|...|...) signifie "l'un des motifs donnés", donc (0[89]|1[0-9]|2[012]) signifie "soit 0[89] ou 1[0-9] ou 2[012] ". Il correspondra à tous les chiffres de 08 à 22.


Une option un peu meilleure est:

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

L'option -F divise chaque ligne en champs distincts selon [: ] regex (correspondant soit : soit un espace), et le script awk vérifie la 2ème colonne (l'heure).

Pourquoi déranger l'utilisation de grep? Vous pouvez simplement utiliser sed.

Exemple:

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

Cela va imprimer tous les journaux entre June 17 13:39:54 et June 18 10:50:28

Il existe en fait un moyen beaucoup plus facile de le faire.

Télécharger / Documentation: autodrgrep.kl.sh

Commander:

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

Explication:

  • Autodrgrep.kl.sh est le nom de l'outil.

  • Notchef est une option passée à l'outil pour lui dire quoi faire. Dans ce cas particulier, il indique à l'outil quel type de fichier journal /tmp/client.log est.

  • /tmp/client.log est bien sûr le fichier journal.

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 est la plage de date à partir du journal que vous souhaitez analyser

  • "INFO" est l'une des chaînes qui se trouve dans les lignes de journaux qui vous intéressent.

  • "A2ensite" est une autre chaîne sur la même ligne que vous attendez à trouver la chaîne "INFO". La spécification de ces deux chaînes (INFO et a2ensite) isole et traite les lignes que vous voulez beaucoup plus rapidement, en particulier si vous rencontrez un fichier journal important.

  • 5 spécifie Avertissement. En spécifiant 5, vous dites au programme d'alerter que AVERTISSEMENT s'il y a au moins 5 occurrences des chaînes de recherche que vous avez spécifiées

  • 10 spécifie Critical. En spécifiant 10, vous indiquez au programme qu'il faut signaler CRITICAL s'il y a au moins 10 occurrences des chaînes de recherche que vous avez spécifiées.

  • -show spécifie le type de réponse que vous obtiendrez. En spécifiant – montré, vous dites si quelque chose est trouvé qui correspond aux motifs spécifiés, sortie à l'écran.

Exemple d'exécution:

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

Que faire si la plage de dates spécifiée par l'utilisateur ou l'intervalle de temps n'est pas dans le journal?

Chaque exécution de la commande ci-dessus aura toujours une ligne (dernière ligne de sortie) qui indique "ATWFILF" ou "ETWNFILF".

  • ATWFILF signifie que la plage de dates réelle ou l'intervalle de temps que vous avez demandé recherché a été trouvé dans le journal. C'est donc très bien.

  • ETWNFILF signifie que la plage de dates réelle ou l'intervalle de temps que vous avez demandé recherché n'a PAS été trouvé dans le journal. Dans ce cas, le moment le plus proche de l'heure que vous avez spécifié sera détecté et utilisé à la place.