Eine einfache Möglichkeit, Protokolldateien zu unterscheiden und dabei die Zeitstempel zu ignorieren?
Frage
Ich muss zwei Protokolldateien unterscheiden, aber den Zeitstempelteil jeder Zeile ignorieren (genauer gesagt die ersten 12 Zeichen).Gibt es ein gutes Tool oder einen cleveren awk-Befehl, der mir helfen könnte?
Andere Tipps
@EbGreen sagte
Ich würde einfach die Protokolldateien nehmen und die Zeitstempel am Anfang jeder Zeile entfernen und die Datei dann in anderen Dateien speichern.Dann unterscheiden Sie diese Dateien.
Das ist wahrscheinlich die beste Wahl, es sei denn, Ihr Differenzierungswerkzeug verfügt über besondere Fähigkeiten.Sie könnten zum Beispiel
cut -b13- file1 > trimmed_file1
cut -b13- file2 > trimmed_file2
diff trimmed_file1 trimmed_file2
In der Antwort von @toolkit finden Sie eine Optimierung, die dies zu einem Einzeiler macht und die Notwendigkeit zusätzlicher Dateien überflüssig macht.Wenn Ihre Shell dies unterstützt.Bash 3.2.39 scheint zumindest ...
Antworten mit cut
sind in Ordnung, aber manchmal bleiben Zeitstempel innerhalb der diff
Die Leistung ist beachtlich.Da geht es um die Frage des OP Ignorieren der Zeitstempel (ohne sie zu entfernen), ich teile hier meine knifflige Befehlszeile:
diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
sed
isoliert die Zeitstempel (#
davor und\n
danach) innerhalb von a Prozesssubstitutiondiff -I '^#'
ignoriert Zeilen mit diesen Zeitstempeln (Zeilen beginnen mit#
)
Beispiel
Zwei Protokolldateien mit demselben Inhalt, aber unterschiedlichen Zeitstempeln:
$> 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
Basic diff
Die Befehlszeile besagt, dass alle Zeilen unterschiedlich sind:
$> 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
Unser Trick diff -I '^#'
zeigt keinen Unterschied an (Zeitstempel werden ignoriert):
$> diff -I '^#' <(sed -r 's/^((.){12})/#\1\n/' 1.log) <(sed -r 's/^((.){12})/#\1\n/' 2.log)
$>
Ändern 2.log
(ersetzen data
von foo
in der 6. Zeile) und überprüfen Sie erneut:
$> 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
=> Zeitstempel werden im gespeichert diff
Ausgabe!
Sie können auch die verwenden Seite an Seite Funktion verwenden -y
oder --side-by-side
Möglichkeit:
$> 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
alt sed
Wenn dein sed
Die Implementierung unterstützt das nicht -r
Option müssen Sie möglicherweise die zwölf Punkte zählen <(sed 's/^\(............\)/#\1\n/' 1.log)
oder verwende ein anderes Muster deiner Wahl ;)
Für eine grafische Option: Melden kann dies mit its tun Textfilter Besonderheit.
Es ermöglicht das Ignorieren von Zeilen, die auf einem oder mehreren Python-Regex basieren.Die Unterschiede werden weiterhin angezeigt, aber Zeilen, die keine anderen Unterschiede aufweisen, werden nicht hervorgehoben.
Verwenden Kdiff3 und bei Konfigurieren>Diff bearbeiten "Befehl für den Line-Matching-Präprozessor" zu so etwas wie:
sed "s/[ 012][0-9]:[0-5][0-9]:[0-5][0-9]//"
Dadurch werden Zeitstempel aus dem Vergleichsausrichtungsalgorithmus herausgefiltert.
Kdiff3 ermöglicht Ihnen auch Richten Sie bestimmte Linien manuell aus.