/ / Trouver des modèles dans plusieurs fichiers journaux? - regex, linux, bash, shell, unix

Rechercher des modèles sur plusieurs fichiers journaux? - regex, linux, bash, shell, unix

J'ai huit fichiers de log au format suivant:

log01:

[Tue Feb 24 07:39:37 2015] *** MARK ***
[Tue Feb 24 07:40:38 2015] *** MARK ***
[Wed Feb 25 17:13:33 2015] *** MARK ***
[Wed Feb 25 17:14:09 2015] *** MARK ***
[Wed Feb 25 17:16:46 2015] *** MARK ***
[Wed Feb 25 17:17:48 2015] *** MARK ***
[Wed Feb 25 17:22:31 2015] *** MARK ***
[Wed Feb 25 19:10:36 2015] *** MARK ***
[Wed Feb 25 19:10:52 2015] *** MARK ***
[Wed Feb 25 19:11:08 2015] *** MARK ***
[Wed Feb 25 19:11:34 2015] *** MARK ***
[Wed Feb 25 19:12:00 2015] *** MARK ***
[Wed Feb 25 19:12:26 2015] *** MARK ***
[Wed Feb 25 19:13:17 2015] *** MARK ***
[Wed Feb 25 19:13:33 2015] *** MARK ***
[Wed Feb 25 19:15:05 2015] *** MARK ***
[Wed Feb 25 19:37:53 2015] *** MARK ***
[Wed Feb 25 19:38:19 2015] *** MARK ***
[Wed Feb 25 19:38:35 2015] *** MARK ***
[Wed Feb 25 23:08:47 2015] *** MARK ***
[Wed Feb 25 23:09:28 2015] *** MARK ***
[Wed Feb 25 23:11:55 2015] *** MARK ***
[Wed Feb 25 23:12:21 2015] *** MARK ***
[Wed Feb 25 23:12:52 2015] *** MARK ***
[Wed Feb 25 23:13:08 2015] *** MARK ***
...

log02:

[Wed Feb 25 07:01:39 2015] *** MARK ***
[Wed Feb 25 17:13:49 2015] *** MARK ***
[Wed Feb 25 17:15:20 2015] *** MARK ***
[Wed Feb 25 17:16:47 2015] *** MARK ***
[Wed Feb 25 17:17:38 2015] *** MARK ***
[Wed Feb 25 17:19:56 2015] *** MARK ***
[Wed Feb 25 17:22:53 2015] *** MARK ***
[Wed Feb 25 19:10:47 2015] *** MARK ***
[Wed Feb 25 19:11:13 2015] *** MARK ***
[Wed Feb 25 19:11:34 2015] *** MARK ***
[Wed Feb 25 19:11:50 2015] *** MARK ***
[Wed Feb 25 19:12:11 2015] *** MARK ***
[Wed Feb 25 19:12:37 2015] *** MARK ***
[Wed Feb 25 19:12:53 2015] *** MARK ***
[Wed Feb 25 19:13:14 2015] *** MARK ***
[Wed Feb 25 19:13:40 2015] *** MARK ***
[Wed Feb 25 19:14:06 2015] *** MARK ***
[Wed Feb 25 19:14:22 2015] *** MARK ***
[Wed Feb 25 19:14:38 2015] *** MARK ***
[Wed Feb 25 19:38:30 2015] *** MARK ***
[Wed Feb 25 21:17:08 2015] *** MARK ***
[Wed Feb 25 23:08:56 2015] *** MARK ***
[Wed Feb 25 23:10:37 2015] *** MARK ***
[Wed Feb 25 23:11:08 2015] *** MARK ***
[Wed Feb 25 23:11:24 2015] *** MARK ***
[Wed Feb 25 23:12:20 2015] *** MARK ***
[Wed Feb 25 23:12:46 2015] *** MARK ***
...

Chaque fichier journal est généré par une instance dumême programme lisant différents capteurs. Une entrée de journal est créée si un capteur détecte un problème. Si chaque capteur détecte un problème après environ une minute, cela signifie qu'un problème global s'est produit. Par exemple:

Les entrées du journal [Tue Feb 24 07:39:37 2015] *** MARK *** et [Tue Feb 24 07:40:38 2015] *** MARK *** de log01 ne correspond à rien dans log02, ce n'est donc pas un problème global et peut être ignoré. Les entrées du journal [Wed Feb 25 07:01:39 2015] *** MARK *** et [Wed Feb 25 21:17:08 2015] *** MARK *** dans log02 peut également être ignoré.

Cependant, l'entrée [Wed Feb 25 19:10:36 2015] *** MARK *** dans log01 et [Wed Feb 25 19:10:47 2015] *** MARK *** dans log02 est dans une minute donc cela indique un problème global qui dure jusqu'à l'entrée [Wed Feb 25 19:15:05 2015] *** MARK *** dans log01 et [Wed Feb 25 19:14:38 2015] *** MARK *** dans log02. Je peux donc en conclure que quelque chose n'allait pas du 25 février entre 19 h 10 et 19 h 15.

Je suis à la recherche de suggestions et de conseils sur la façon d’aborder ce problème, de préférence en utilisant des utilitaires UNIX.

Réponses:

0 pour la réponse № 1

Je pense que la manière élégante serait d'utiliser Perl pour lire tous les fichiers et créer un tableau de listes. Le premier tableau serait indexé par le temps arrondi à la minute la plus proche, et vous pousseriez un 1 sur la liste à un moment donné si vous lisiez de file01 et un 2 si tu lisais file02. Puis, à la fin, vous parcourerez le premier tableau en recherchant des listes dont la longueur est supérieure à un. UNE Perl tag pourrait aider là-bas.

Si vous n'aimez pas Perl, vous pouvez mettre quelque chose de plus maladroit, comme ceci.

Étape 1: Choisissez une heure de début antérieure à la première heure souhaitée.

Étape 2: Analyser chaque fichier en générant une ligne par minute de données en entrée. Cette ligne est 0 ou 1 selon qu'il y a un problème ou non. Une ligne par minute garantit que tous les fichiers s'aligner correspondant à la minute sur tous les 8.

Étape 3: Utiliser paste pour mettre tous les 8 fichiers de sortie ensemble comme ceci:

paste -d, file{1..8}

1,0,1,1,1,0,1,1
1,1,1,1,1,1,1,1
0,0,1,1,0,0,0,1
0,1,1,1,0,1,0,1
0,0,1,1,0,0,0,1
0,1,1,1,0,1,0,1
1,0,1,1,1,0,1,1
1,1,1,1,1,1,1,1

Étape 4: Utiliser awk pour rechercher des lignes qui totalisent plus de 1.


0 pour la réponse № 2

Vous pouvez essayer quelque chose comme ça:

#!/bin/bash

for n in $(awk -F" " "{print $4;}" log01 | cut -c1-5)
do
if (grep -q $n log02)
then
echo "Error on $n"
fi
done
  • La commande awk -F" " "{print $4;}" log01 | cut -c1-5 extrait l'heure (hh:mm) de ton log01 fichier.
  • grep -q $n log02 recherchez cette heure et signalez-la si vous l'avez trouvée.