diff
(und die verschiedenen Optionen) zeigen Ihnen beide Möglichkeiten und behalten die Reihenfolge der Nachrichten bei. Es werden jedoch keine Duplikate von Unterschieden entfernt (für die Sie sich uniq
später bewerben können ) oder sich mit abweichender Reihenfolge befassen. Ist das gut genug?
Intelligente "Subtraktion" einer Textdatei von einer anderen
Beispiel: Die Anwendung generiert eine große Textprotokolldatei A
mit vielen verschiedenen Meldungen. Es erzeugt eine ähnlich große Protokolldatei, B
wenn es nicht ordnungsgemäß funktioniert.
Ich möchte sehen, welche Nachrichten in der Datei B
grundsätzlich neu sind, dh alles ausfiltern A
.
Trivialer Prototyp ist:
- Sortieren | uniq beide Dateien
- Dateien verbinden
- sortieren | uniq -c
- grep -v "^ 2"
Dies erzeugt einen symmetrischen Unterschied und ist unpraktisch. Wie geht es besser? (einschließlich nicht symmetrischer Unterschiede und Erhalt der Nachrichtenreihenfolge in B
)
Das Programm sollte zuerst analysieren A
und lernen, welche Nachrichten allgemein sind, und dann das Anzeigen B
mit den Nachrichten analysieren, die Aufmerksamkeit erfordern.
Idealerweise sollte es Dinge wie Zeitstempel, Zeilennummern oder andere unbeständige Dinge automatisch ignorieren.
Beispiel. EIN:
0:00:00.234 Received buffer 0x324234 0:00:00.237 Processeed buffer 0x324234 0:00:00.238 Send buffer 0x324255 0:00:03.334 Received buffer 0x324255 0:00:03.337 Processeed buffer 0x324255 0:00:03.339 Send buffer 0x324255 0:00:05.171 Received buffer 0x32421A 0:00:05.173 Processeed buffer 0x32421A 0:00:05.178 Send buffer 0x32421A
B:
0:00:00.134 Received buffer 0x324111 0:00:00.137 Processeed buffer 0x324111 0:00:00.138 Send buffer 0x324111 0:00:03.334 Received buffer 0x324222 0:00:03.337 Processeed buffer 0x324222 0:00:03.338 Error processing buffer 0x324222 0:00:03.339 Send buffer 0x3242222 0:00:05.271 Received buffer 0x3242FA 0:00:05.273 Processeed buffer 0x3242FA 0:00:05.278 Send buffer 0x3242FA 0:00:07.280 Send buffer 0x3242FA failed
Ergebnis:
0:00:03.338 Error processing buffer 0x324222 0:00:07.280 Send buffer 0x3242FA failed
Eine Möglichkeit, es zu lösen, kann so etwas sein:
- Split jede Zeile in logischen Einheiten:
0:00:00.134 Received buffer 0x324111
,0:00:00.134
,Received
,buffer
,0x324111
,324111
,Received buffer
,\d:\d\d:\d\d\.\d\d\d
,\d+:\d+:\d+.\d+
,0x[0-9A-F]
, ... Es soll einzelne Worte finden, einfache Muster in Zahlen, gemeinsame Layouts (zB „einig Datum als Text als Zahl als Text als end_of_line“), auch Handle Kombinationen von oben. Da es keine einfache Aufgabe ist, müssen Benutzerunterstützung (Hinzufügen von regulären Ausdrücken mit explizitem "Ignorieren von", "machen den Hauptfaktor", "nicht in Teile aufteilen", "als Datum / Nummer berücksichtigen") für Reihenfolge / Menge sorgen für solche Nachrichten "Regeln" sollte unterstützt werden (aber nicht erforderlich). - Suchen Sie sich wiederkehrende Einheiten und "kategorisieren" Sie Zeilen, filtern Sie zu unbeständige Dinge wie Zeitstempel, Adressen oder Zeilennummern.
- Analysieren Sie die zweite Datei, finden Sie Dinge, die neue logische Einheiten haben (einmalig oder wiederkehrend), oder alles, was das System, das sich an die erste Datei gewöhnt hat, "überraschen" wird.
Beispiel dafür, wie Sie etwas manuell ausführen:
$ cat A | head -n 1 0:00:00.234 Received buffer 0x324234 $ cat A | egrep -v "Received buffer" | head -n 1 0:00:00.237 Processeed buffer 0x324234 $ cat A | egrep -v "Received buffer|Processeed buffer" | head -n 1 0:00:00.238 Send buffer 0x324255 $ cat A | egrep -v "Received buffer|Processeed buffer|Send buffer" | head -n 1 $ cat B | egrep -v "Received buffer|Processeed buffer|Send buffer" 0:00:03.338 Error processing buffer 0x324222 0:00:07.280 Send buffer 0x3242FA failed
Dies ist eine langweilige Sache (es gibt viele Nachrichtentypen); Ich kann auch versehentlich ein zu breites Muster hinzufügen. Es kann auch nicht mit komplizierten Dingen wie Wechselbeziehungen zwischen Nachrichten umgehen.
Ich weiß, dass es KI-bezogen ist. Möglicherweise gibt es bereits entwickelte Werkzeuge?
3 Antworten auf die Frage
Verwenden Sie diff
(im normalen Ausgabemodus, dh kein -c
oder -u
). Die neuen Zeilen werden mit vorangestellt >
.
diff A B | sed -ne 's/> //p'
Wenn die Protokolle Zeitstempel enthalten, müssen Sie sie zuerst entfernen.
Manchmal ist es schöner, die neuen / geänderten Bits im Kontext zu sehen, wobei der Unterschied hervorgehoben wird und die Navigation zwischen verschiedenen Abschnitten erfolgt. Emacs hat dafür eine schöne Schnittstelle (Menü Extras | Vergleichen, M-x ediff-files
). Es gibt auch viele eigenständige Tools (oft mit "diff" oder "compare" im Namen).
Wenn Sie an der Reihenfolge der Zeilen nicht interessiert sind, comm
wäre das Sortieren der beiden Dateien nach und nach einfacher und angenehmer als der Prozess, den Sie in Ihrer Frage angeben.
Dies ist ein schwieriges Problem und in allgemeiner Form ein aktives Forschungsproblem. Ich glaube nicht, dass es jetzt ein Programm gibt, in das Sie nur ein paar Regexx einstecken müssen.
Ich würde Ihr Programm so formulieren, als würde ich versuchen, die Spuren eines vernetzten Programms zu vergleichen. Ich vermute, dass Leute, die Spuren von vernetzten oder gleichzeitigen Programmen vergleichen, dieses Problem angetreten haben und ihre eigenen Werkzeuge geschrieben haben, aber ich habe kein spezielles Beispiel.
Verwandte Probleme
-
9
Was ist der Unterschied zwischen den Befehlen "su -s" und "sudo -s"?
-
4
Gutes freies Ubuntu Server-VMWare-Image benötigt
-
4
Was sind die Unterschiede zwischen den großen Linux-Distributionen? Werde ich es merken
-
2
Begrenzung der CPU-Auslastung für Flash in Firefox?
-
2
Wie kann ich mein Mikrofon unter Debian GNOME zum Laufen bringen?
-
2
Conky-Setups - Beispiele / Ideen?
-
3
Was sind die Unterschiede zwischen Linux Window Managern?
-
2
ThunderBird / Lichtsynchronisation mit SE k770i
-
4
Linux-Dateisystem
-
6
Vollbild-Flash langsam in KDE 4