J'ai un fichier journal, chaque ligne du journal est précédée d'une date, comme suit:
2012-03-06 11:34:48,657 blah blah blah...
Comment je grep
ce fichier et obtenir uniquement les lignes de 8h à 23h?
Mon intention est de compter le nombre d’erreurs commises entre 8 heures et 23 heures.
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'
Des explications détaillées peuvent être trouvées dans divers tutoriels regex (expression régulière); egrep
utilise la syntaxe "POSIX extended" (man 7 regex
).
Le premier ^
signifie "début de la ligne".
[^ ]+
correspond simplement au champ de date, quelle que soit la date réelle.
[...]
signifie "tout caractère entre crochets", donc [89]
correspondra soit à 8
, soit à 9
; [0-9]
est un nombre quelconque, et [^ ]
est tout sauf un espace (en raison de ^
entre crochets).
+
signifie "un ou plus de l'ancien" (par exemple, a+
correspondrait à a
, aaa
et aaaaaaaa
).
Donc, ^[^ ]+
commencera par le début de la ligne et correspondra au plus grand nombre de caractères non espaces possibles.
(...|...|...)
signifie "l'un des modèles donnés", donc (0[89]|1[0-9]|2[012])
signifie "soit 0[89]
, soit 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 en fonction de l'expression regex [: ]
(correspondant à :
ou à un espace) et le script awk vérifie la 2e colonne (l'heure).
Pourquoi s'embêter à utiliser grep? Vous pouvez simplement utiliser sed.
exemple:
sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log
Ceci imprimera 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 faire cela.
Téléchargement/documentation: autodrgrep.kl.sh
Commande:
./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 qui est transmise à l’outil pour lui dire quoi faire. Dans ce cas particulier, il indique à l'outil le type de fichier journal /tmp/client.log.
/tmp/client.log est bien sûr le fichier journal.
2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 correspond à la plage de dates figurant dans le journal que vous souhaitez analyser.
"INFO" est l'une des chaînes figurant dans les lignes de journaux qui vous intéressent.
"a2ensite" est une autre chaîne de la même ligne sur laquelle vous vous attendez à trouver la chaîne "INFO". La spécification de ces deux chaînes (INFO et a2ensite) permet d'isoler et de traiter les lignes souhaitées beaucoup plus rapidement, en particulier si vous traitez avec un fichier journal volumineux.
5 spécifie l'avertissement. En spécifiant 5, vous indiquez au programme d’avertir comme AVERTISSEMENT s’il existe au moins 5 occurrences des chaînes de recherche spécifiées.
10 spécifie critique. En spécifiant 10, vous indiquez au programme de signaler CRITICAL s'il existe au moins 10 occurrences des chaînes de recherche spécifiées.
-show spécifie le type de réponse que vous obtiendrez. En spécifiant -shown, vous indiquez que si vous trouvez quelque chose qui correspond aux modèles spécifiés, exportez-le à l'écran.
Exemple d'analyse:
# ./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 se passe-t-il si la plage de dates ou l'heure spécifiée par l'utilisateur ne figure pas dans le journal?
Chaque exécution de la commande ci-dessus aura toujours une ligne (dernière ligne de la sortie) qui indique "ATWFILF" ou "ETWNFILF".
ATWFILF signifie que la plage de dates réelle ou la plage de temps recherchée a été trouvée dans le journal. Donc c'est très bien.
ETWNFILF signifie que la plage de dates réelle ou la plage de temps que vous avez demandée n'a PAS été trouvée dans le journal. Dans ce cas, l'heure la plus proche de l'heure que vous avez spécifiée sera détectée et utilisée à la place.