Eine einfache Möglichkeit, Protokolldateien zu unterscheiden und dabei die Zeitstempel zu ignorieren?

StackOverflow https://stackoverflow.com/questions/44019

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?

War es hilfreich?

Lösung

Abhängig von der verwendeten Schale können Sie den Ansatz drehen @Blair in einem 1-Zeiler vorgeschlagen

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

(+1 bis @Blair für den ursprünglichen Vorschlag :-)

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 Prozesssubstitution
  • diff -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 diffAusgabe!

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.

Example configuration

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top