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 ?

Était-ce utile?

La solution

Selon le shell que vous utilisez, vous pouvez tourner l'approche @Blair suggéré dans un 1-liner

diff <(cut -b13- file1) <(cut -b13- file2)

(+1 à @Blair pour la suggestion originale :-)

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 processus
  • diff -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 diffsortir!

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.

Example configuration

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top