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

22

J'ai un fichier journal, chaque ligne du journal est précédée d'une date, comme ceci:

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

Comment puis-je obtenir grepce fichier et obtenir uniquement les lignes de 8h à 23h uniquement?

Mon intention est que je veuille compter le nombre d'erreurs survenant entre 8h et 23h.

Rosdi
la source

Réponses:

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

Explication détaillée peut être trouvée dans divers regex tutoriels (expression régulière); egreputilise la syntaxe "POSIX étendu" ( man 7 regex).

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

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

    • [...]signifie "n'importe quel caractère entre crochets", donc [89]correspondra à 8ou 9; [0-9]est n'importe quel nombre et [^ ]est tout sauf un espace (à cause des ^crochets intérieurs).

    • +signifie « un ou plusieurs de la précédente » (par exemple, a+pourrait correspondre a, aaaet aaaaaaaa).

    • Alors , ^[^ ]+va commencer avec le début de la ligne, et correspondent à 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 numéros de 08 à 22.


Une option un peu meilleure est:

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

L' -Foption divise chaque ligne en champs séparés selon l' [: ]expression régulière (correspondant soit à :un espace), et le script awk vérifie la 2e colonne (l'heure).

grawity
la source
Salut, cela fonctionne .. mais pouvez-vous ajouter une petite explication sur la façon dont cela fonctionne? Je ne comprends pas la ^[^ ]+partie ..
Rosdi
20

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

Cela imprimera tous les journaux entre June 17 13:39:54etJune 18 10:50:28

Nima G
la source
1
Je pense que l'OP veut tous les journaux entre 8h et 23h, uniquement ceux d'une journée spécifique.
Dennis
1
Il peut le faire aussi. Par exemple: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G
1
Coquine typo. Je voulais dire: pas ceux d'un jour spécifique.
Dennis
2
Le problème avec cette approche est qu'il doit y avoir une ligne dans le fichier journal avec cet horodatage. Dans l'exemple ci-dessus, s'il n'y a pas de ligne avec l'horodatage 2012-03-06 11:34:48, alors rien ne s'imprimera. L'approche awk ci-dessus fonctionnerait pour de tels cas (c'est-à-dire que vous voulez tous les journaux avec une heure entre 8 et 11, mais vous ne savez pas s'il y a une entrée de journal au moment 2012-03-06 08:00:00 ou quoi que ce soit pour cela heure du tout).
user650654
0

Il existe en fait un moyen beaucoup plus simple de procéder.

Téléchargement / 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 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 est la plage de dates à partir du journal que vous souhaitez numériser

  • "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 sur laquelle vous 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 avez affaire à un énorme fichier journal.

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

  • 10 spécifie Critique. En spécifiant 10, vous dites au programme d'alerter comme CRITIQUE 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 -shown, vous dites si quelque chose est trouvé qui correspond aux modèles spécifiés, la 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 ou le délai spécifié par l'utilisateur n'est pas dans le journal?

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

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

  • ETWNFILF signifie que la plage de dates ou l'intervalle de temps que vous avez recherché n'a pas été trouvé 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.

SimplifiedWork
la source