Domanda

Devo differenziare due file di registro ma ignorare la parte del timestamp di ciascuna riga (i primi 12 caratteri per l'esattezza).Esiste un buon strumento o un comando awk intelligente che potrebbe aiutarmi?

È stato utile?

Soluzione

A seconda della shell che stai utilizzando, puoi cambiare l'approccio @Blair suggerito in un 1-liner

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

(+1 a @Blair per il suggerimento originale :-)

Altri suggerimenti

@EbGreen ha detto

Vorrei semplicemente prendere i file di registro ed eliminare i timestamp dall'inizio di ogni riga, quindi salvare il file in file diversi.Quindi differenzia quei file.

Questa è probabilmente la soluzione migliore, a meno che il tuo strumento di confronto non abbia poteri speciali.Ad esempio, potresti

cut -b13- file1 > trimmed_file1
cut -b13- file2 > trimmed_file2
diff trimmed_file1 trimmed_file2

Vedi la risposta di @ toolkit per un'ottimizzazione che lo rende un one-liner ed elimina la necessità di file aggiuntivi.Se la tua shell lo supporta.Bash 3.2.39 almeno sembra...

Risposte utilizzando cut vanno bene, ma a volte mantengono i timestamp all'interno del file diff la resa è apprezzabile.Poiché riguarda la domanda dell'OP ignorando i timestamp (senza rimuoverli), condivido qui la mia complicata riga di comando:

diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
  • sed isola i timestamp (# prima e \n dopo) entro a sostituzione del processo
  • diff -I '^#' ignora le righe con questi timestamp (righe che iniziano con #)

esempio

Due file di registro con lo stesso contenuto ma timestamp diversi:

$> 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

Di base diff la riga di comando dice che tutte le righe sono diverse:

$> 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

Il nostro complicato diff -I '^#' non mostra alcuna differenza (timestamp ignorati):

$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
$>

Modifica 2.log (sostituire data di foo sulla sesta riga) e controllare di nuovo:

$> 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

=> i timestamp sono conservati nel file diffproduzione!

Puoi anche usare il fianco a fianco funzionalità utilizzando -y O --side-by-side opzione:

$> 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

vecchio sed

Se tuo sed l'implementazione non supporta il -r opzione, potrebbe essere necessario contare i dodici punti <(sed 's/^\(............\)/#\1\n/' 1.log) oppure usa un altro modello a tua scelta ;)

Per un'opzione grafica, Fondere puoi farlo usando il suo filtri di testo caratteristica.

Consente di ignorare le linee basate su una o più regex Python.Le differenze verranno comunque visualizzate, ma le linee che non presentano altre differenze non verranno evidenziate.

Example configuration

Utilizzo Kdiff3 e a Configura>Diff modificare "Comando del preprocessore di corrispondenza della riga" a qualcosa del tipo:

sed "s/[ 012][0-9]:[0-5][0-9]:[0-5][0-9]//"

Ciò filtrerà i timestamp dall'algoritmo di allineamento del confronto.

Anche Kdiff3 ti consente allineare manualmente linee specifiche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top