Un moyen simple de comparer les fichiers journaux, en ignorant les horodatages ?
Question
Je dois comparer deux fichiers journaux mais ignorer la partie horodatage de chaque ligne (les 12 premiers caractères pour être exact).Existe-t-il un bon outil, ou une commande awk intelligente, qui pourrait m'aider ?
Autres conseils
@EbGreen a dit
Je voudrais simplement prendre les fichiers journaux et supprimer les horodatages au début de chaque ligne, puis enregistrer le fichier dans différents fichiers.Ensuite, comparez ces fichiers.
C'est probablement la meilleure solution, à moins que votre outil de comparaison ne dispose de pouvoirs spéciaux.Par exemple, vous pourriez
cut -b13- file1 > trimmed_file1
cut -b13- file2 > trimmed_file2
diff trimmed_file1 trimmed_file2
Voir la réponse de @toolkit pour une optimisation qui en fait une ligne unique et évite le besoin de fichiers supplémentaires.Si votre shell le prend en charge.Bash 3.2.39 semble au moins...
Réponses en utilisant cut
sont bien, mais gardent parfois les horodatages dans les limites diff
le rendu est appréciable.Comme la question du PO concerne ignorer les horodatages (sans les supprimer), je partage ici ma ligne de commande délicate :
diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
sed
isole les horodatages (#
avant et\n
après) dans un substitution de processusdiff -I '^#'
ignore les lignes ayant ces horodatages (les lignes commençant par#
)
exemple
Deux fichiers journaux ayant le même contenu mais des horodatages différents :
$> for ((i=1;i<11;i++)) do echo "09:0${i::1}:00.000 data $i"; done > 1.log
$> for ((i=1;i<11;i++)) do echo "11:00:0${i::1}.000 data $i"; done > 2.log
Basique diff
La ligne de commande indique que toutes les lignes sont différentes :
$> diff 1.log 2.log
1,10c1,10
< 09:01:00.000 data 1
< 09:02:00.000 data 2
< 09:03:00.000 data 3
< 09:04:00.000 data 4
< 09:05:00.000 data 5
< 09:06:00.000 data 6
< 09:07:00.000 data 7
< 09:08:00.000 data 8
< 09:09:00.000 data 9
< 09:01:00.000 data 10
---
> 11:00:01.000 data 1
> 11:00:02.000 data 2
> 11:00:03.000 data 3
> 11:00:04.000 data 4
> 11:00:05.000 data 5
> 11:00:06.000 data 6
> 11:00:07.000 data 7
> 11:00:08.000 data 8
> 11:00:09.000 data 9
> 11:00:01.000 data 10
Notre délicat diff -I '^#'
n'affiche aucune différence (horodatages ignorés) :
$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
$>
Changement 2.log
(remplacer data
par foo
sur la 6ème ligne) et vérifiez à nouveau :
$> sed '6s/data/foo/' -i 2.log
$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
11,13c11,13
11,13c11,13
< #09:06:00.000
< data 6
< #09:07:00.000
---
> #11:00:06.000
> foo 6
> #11:00:07.000
=> les horodatages sont conservés dans le diff
sortir!
Vous pouvez également utiliser le cote à cote fonctionnalité utilisant -y
ou --side-by-side
option:
$> diff -y -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
#09:01:00.000 #11:00:01.000
data 1 data 1
#09:02:00.000 #11:00:02.000
data 2 data 2
#09:03:00.000 #11:00:03.000
data 3 data 3
#09:04:00.000 #11:00:04.000
data 4 data 4
#09:05:00.000 #11:00:05.000
data 5 data 5
#09:06:00.000 | #11:00:06.000
data 6 | foo 6
#09:07:00.000 | #11:00:07.000
data 7 data 7
#09:08:00.000 #11:00:08.000
data 8 data 8
#09:09:00.000 #11:00:09.000
data 9 data 9
#09:01:00.000 #11:00:01.000
data 10 data 10
vieux sed
Si ton sed
la mise en œuvre ne prend pas en charge le -r
option, vous devrez peut-être compter les douze points <(sed 's/^\(............\)/#\1\n/' 1.log)
ou utilisez un autre modèle de votre choix ;)
Pour une option graphique, Fusionner peut le faire en utilisant son filtres de texte fonctionnalité.
Il permet d'ignorer les lignes basées sur une ou plusieurs expressions régulières python.Les différences apparaissent toujours, mais les lignes qui ne présentent aucune autre différence ne seront pas mises en évidence.
Utiliser Kdiff3 et à Configurer>Diff modifier "Commande de préprocesseur de correspondance de ligne" à quelque chose comme :
sed "s/[ 012][0-9]:[0-5][0-9]:[0-5][0-9]//"
Cela filtrera les horodatages de l’algorithme d’alignement de comparaison.
Kdiff3 vous permet également aligner manuellement des lignes spécifiques.