Diff-Helfer im Überblick (Teil 1)

Aus LinuxUser 11/2021

Diff-Helfer im Überblick (Teil 1)

© natavkusidey / 123RF.com

Vive la différence!

Diffs sind auf den ersten Blick oft etwas schwer zu durchschauen. Wir stellen Tools vor, mit denen Sie durchblicken.

Bei kurzen Passagen fallen Unterschiede zwischen zwei Texten bereits durch einfaches Hinsehen auf. Ab einem bestimmten Umfang helfen dagegen nur noch auf das Vergleichen spezialisierte Werkzeuge, die die Unterschiede entsprechend hervorheben.

Solche Tools unterscheiden sich primär darin, ob sie nur Fragmente (Zeilen) verarbeiten oder komplette Dateien. Unterschiede gibt es auch dabei, wie die Software jeweils die gefundenen Stellen ausgibt, also mittels besonderer Markierungen oder farblicher Hervorhebungen. Manche Werkzeuge spezialisieren sich auf bestimmte Formate wie Text, XML, JSON, komprimierte Dateien oder Archive. Einige können den Diff im Nachgang wieder für bestimmte Aktionen verwenden, andere nicht. Und zu guter Letzt gibt es neben Differn für die Kommandozeile und für die grafische Oberfläche auch solche, die eine webbasierte Schnittstelle bereitstellen.

Über solche Werkzeuge zum Vergleich von Dateien haben wir im Lauf der Jahre schon mehrfach berichtet. Die Tabelle “Weitere Beiträge” weist auf entsprechenden Lesestoff hin, den Sie zum großen Teil frei zugänglich online finden.

Suche in Archiven

LU 06/2012, S. 82

https://www.linux-community.de/25404

Grep-Varianten (Teil 1)

LU 06/2012, S. 82

https://www.linux-community.de/25404

Grep-Varianten (Teil 2)

LU 06/2012, S. 82

https://www.linux-community.de/25404

Zu Befehl: Diff und Patch

LU 03/2004, S. 76

https://www.linux-community.de/5452

Dateien vergleichen

EL 02/2014, S. 115

https://www.linux-community.de/31710

PDFs vergleichen

LU 07/2015, S. 70

https://www.linux-community.de/33881

LU = LinuxUser, EL = EasyLinux

Mit an Bord

Linux liefert üblicherweise die beiden Werkzeuge Diff und Diff3 mit. In Debian gehören beide zum essenziellen Paket diffutils. Das erste Tool verarbeitet nur zwei Dateien, Diff3 hingegen bis zu drei. Beide Programme vergleichen die als Parameter übermittelten Files zeilenweise. Das passt sehr gut für den Programmcode, um Änderungen zwischen zwei Varianten einer oder mehrerer Versionen aufzuspüren. Die Tabelle “Modi” zeigt nützliche Optionen für beide Programme.

Option

Langform

Beschreibung

-q

--brief

Anzeigen, ob sich Dateien unterscheiden.

-s

--report-identical-files)

Anzeigen, ob Dateien identisch sind.

-u

Drei Zeilen Kontext ausgeben.

-w

--ignore-all-space

Alle Leerzeilen ignorieren.

-y

--side-by-side

Unterschiede spaltenweise ausgeben.

Diff und Diff3 haben sich im Alltag bewährt, bereiten aber in manchen Fällen Probleme. So geben beide als Ergebnis diejenigen Zeilen aus, die sich in den analysierten Dateien entweder unterscheiden oder in einer fehlen beziehungsweise zusätzlich auftauchen. Vor der Zeile, die nicht übereinstimmt, lesen Sie einen zusätzlichen Kommentar, der den gefundenen Unterschied genauer beschreibt. Die Tabelle “Gegenüberstellung” stellt die Inhalte der drei Dateien regionen1, regionen2 und regionen3 mit den Beispieldaten gegenüber.

Zeile

regionen1

regionen2

regionen3

1

Fichtelgebirge

Fichtelgebirge

Fichtelgebirge

2

Jura

Harz

Jura

3

Schwarzwald

Jura

Erzgebirge

4

Vogesen

Vogesen

Vogesen

Listing 1 zeigt einen Vergleich von regionen1 und regionen2 mittels Diff. Es stellt dabei fest, dass in der Datei regionen2 das Wort “Harz” zwischen der ersten und zweiten Zeile von regionen1 hinzugefügt (a für “appended”) und die Zeile 3 “Schwarzwald” entfernt wurde (d für “deleted”). Erscheint ein < vor einer Zeile der Ausgabe, befindet sich der Unterschied in der ersten Datei, bei einem > hingegen in der zweiten Datei.

Listing 1

Dateivergleich mit Diff

$ diff regionen1 regionen2
1a2
> Harz
3d3
< Schwarzwald

Listing 2 zeigt den Vergleich aller drei Beispieldateien mittels Diff3. Als Ausgangspunkt und Referenz dient hier die erste Datei. Die erste Zeile der Ausgabe (====2) besagt, dass Sie die Änderungen aus der zweiten Datei (regionen2) an die erste und dritte Datei anfügen müssen (a), um diese zu vervollständigen – sprich: es gilt, “Harz” hinzuzufügen.

Listing 2

Dateivergleich mit Diff3

$ diff3 regionen*
====2
1:1a
3:1a
2:2c
  Harz
====
1:3c
  Schwarzwald
2:3a
3:3c
  Erzgebirge

Im zweiten Block hat sich in allen Dateien jeweils die dritte Zeile in “Jura” beziehungsweise “Erzgebirge” geändert, daher c als Abkürzung für “changed”. Detailliertere Erklärungen und weitere Beispiele für den Umgang mit Diff3 liefert ein etwas älterer, aber immer noch lesenswerter Beitrag von Himanshu Arora [1].

Grafisch aufgepeppt

Etwas verständlicher fällt die Anzeige der Unterschiede zwischen den Dateien beim grafischen Werkzeug Kdiff3 [2] aus (Abbildung 1). Es wertet die Ausgabe von Diff3 aus und markiert Veränderungen farbig – sowohl direkt im Text, als auch am Rand neben der Zeilennummer. Dabei weist Rot auf eine Löschung von Zeilen oder einzelnen Buchstaben hin, Gelb auf eine Veränderung und Grün auf eine Ergänzung. Damit finden Sie auf Anhieb die Stellen, die sich von Datei zu Datei unterscheiden, und sehen insbesondere, was sich geändert hat.

Abbildung 1: Die farbige Anzeige der Unterschiede in Kdiff3 erleichtert es, die &Auml;nderungen zu erfassen.

Abbildung 1: Die farbige Anzeige der Unterschiede in Kdiff3 erleichtert es, die Änderungen zu erfassen.

Ähnlich wie Kdiff3 verhält sich auch Meld [3], das wir in LU 07/2017 ausführlich porträtiert haben [4]. Es vermag bis zu drei Dateien und sogar Verzeichnisse zu analysieren. Dabei arbeitet das Tool zeilenweise und zeigt mithilfe von farbig hinterlegten Zeilen sowie Pfeilen die Veränderungen. In Abbildung 2 kann man erkennen, dass sich die beiden Dateien regionen1 und regionen3 in genau einer Zeile unterscheiden.

Abbildung 2: Das Werkzeug Meld stellt die Unterschiede zwischen Dateien grafisch dar.

Abbildung 2: Das Werkzeug Meld stellt die Unterschiede zwischen Dateien grafisch dar.

Ausgabe

Wie Sie bislang gesehen haben, weisen Diff und Diff3 die Unterschiede zwischen den Dateien detailliert auf, benutzen dazu jedoch ein recht eigenwilliges Format. Beide versagen jedoch, wenn Sie in einer Datei nur ein paar Wörter einschieben und dann den Absatz neu umbrechen. In einem solchen Fall erkennen die Werkzeuge ab dem eingeschobenen Wort den Rest des Absatzes lediglich als anders und führen diesen Teil im Ergebnis des Vergleichs auf.

Zudem eignet sich keines der beiden Tools für das Vergleichen von Nicht-Text-Formaten, wie TAR-Archiven, komprimierten Dateien oder Bildern. Beiden fehlt ebenfalls eine Möglichkeit, Unterschiede farblich hervorzuheben. Kdiff3 und Meld machen dieses Manko durch ihre Bedienoberfläche wett. Es gibt aber noch mehr Diff-Varianten mit interessanten Funktionen.

Mit Farbe

Das in der modernen, an C angelehnten Programmiersprache Rust [5] geschriebene Kommandozeilenwerkzeug Difference [6] akzeptiert zwei Zeichenketten – keine Dateien – als Parameter. Es vergleicht die Strings zeilen-, wort- beziehungsweise buchstabenweise über die Parameter --split line, --split word beziehungsweise --split char. Geben Sie im Aufruf keinen Parameter an, trennt es an den Wortgrenzen. Den Parameter --split dürfen Sie im Aufruf auch mittels -s abkürzen.

Die Unterschiede zwischen den beiden Zeichenketten hebt Difference in der Ausgabe farblich hervor. Rote Schrift bedeutet, dass der betreffende Teil der ersten Zeichenkette nicht in der zweiten vorkommt. Grün bedeutet, dass der fragliche Teil der zweiten Zeichenkette nicht Bestandteil der ersten ist. Nicht farblich hervorgehobener Text findet sich in beiden Zeichenketten. Abbildung 3 zeigt das Verhalten des Programms anhand einer kleinen Städteliste. Das Wort “Genf” erscheint in Rot beziehungsweise “Chur” in Grün, da die jeweilige Stadt nicht in der zweiten beziehungsweise ersten Städteliste vorkommt.

Abbildung 3: Mit dem Tool Difference erkennen Sie die Unterschiede zwischen zwei Zeichenketten, hier am Beispiel einer Liste mit St&auml;dtenamen.

Abbildung 3: Mit dem Tool Difference erkennen Sie die Unterschiede zwischen zwei Zeichenketten, hier am Beispiel einer Liste mit Städtenamen.

Aufs Wort

Wdiff [7] und Dwdiff [8] finden Sie in den gleichnamigen Debian-Paketen, Cwdiff [9] hingegen bislang nur als Shell-Skript über die Webseite des Autors Iain Murray. Alle drei Tools erwarten zwei Dateien als Parameter und vergleichen diese wortweise. Als Basis dient dabei stets die erste Datei. Unterschiede in der zweiten Datei zeigen die Programme durch Klammern an. In Abbildung 4 ist der entsprechende Bereich gelb eingerahmt. Fehlende Inhalte stehen in eckigen Klammern mit Minuszeichen, zusätzliche in geschweiften Klammern mit Pluszeichen.

Abbildung 4: Ein Tool wie Wdiff zeigt die Unterschiede zwischen zwei Abs&auml;tzen wortgenau an.

Abbildung 4: Ein Tool wie Wdiff zeigt die Unterschiede zwischen zwei Absätzen wortgenau an.

Bezogen auf die Schalter arbeiten die drei Werkzeuge identisch. Dwdiff und Cwdiff heben sich von Wdiff nur dadurch ab, dass sie Unterschiede in der Ausgabe einfärben. Dabei kommt dasselbe Farbschema zum Einsatz wie beim bereits vorgestellten Werkzeug Difference. Während Cwdiff das gleich von sich aus macht, schaltet Dwdiff erst mit dem Schalter -c (Langform --color) in diesen Modus um.

In Abbildung 5 sehen Sie zwei Vergleichsläufe – oben zwischen den beiden Dateien regionen1 und regionen2, darunter zwischen regionen1 und regionen3. Beim ersten Vergleich unterscheiden sich zwei komplette Zeilen: “Harz” kommt hinzu, “Schwarzwald” fehlt. Beim zweiten Vergleich zeigt sich, dass die Zeile “Schwarzwald” der Zeile “Erzgebirge” gewichen ist.

Abbildung 5: Dwdiff bietet die M&ouml;glichkeit, die Unterschiede zwischen den Dateien durch Farben noch deutlicher zu machen.

Abbildung 5: Dwdiff bietet die Möglichkeit, die Unterschiede zwischen den Dateien durch Farben noch deutlicher zu machen.

Farbenspiele

Die Werkzeuge Colordiff [10] und Ccdiff [11] funktionieren genauso wie Diff, färben allerdings die Ausgabe mithilfe von ANSI-Escape-Sequenzen [12] ein. Ccdiff hinterlegt die jeweilige Zeile grau, Colordiff lässt sie unverändert.

Ccdiff benutzt das traditionelle Ausgabeformat von Diff, während Colordiff hinzugefügte Zeilen mit +++ kennzeichnet und in grüner Farbe darstellt. Entfernte Zeilen tragen das Präfix --- und erscheinen in Rot. Abbildung 6 zeigt den Aufruf von Colordiff unter Einsatz des Schalters -u, der für eine Ausgabe der Zeilen untereinander sorgt. Der gezeigte Aufruf entspricht dem Kommando aus Listing 3, das die Ausgabe von Diff über eine Pipe an Colordiff weiterleitet.

Abbildung 6: Colordiff hilft Differn auf die Spr&uuml;nge, die von sich aus keine farbige Ausgabe erzeugen.

Abbildung 6: Colordiff hilft Differn auf die Sprünge, die von sich aus keine farbige Ausgabe erzeugen.

Listing 3

Colordiff im Einsatz

diff -u regionen1 regionen2 | colordiff

Diff-Formate

Colordiff arbeitet mit verschiedenen Diff-Ausgaben zusammen und färbt sie ein. Mitunter braucht es dazu etwas Nachhilfe in Form des zusätzlichen Schalters --difftype mit einem passenden Wert. Derzeit versteht es diff, diffc, diffu, diffy, wdiff und debdiff für das jeweilige Format beziehungsweise Werkzeug. Dabei beziehen sich diffc, diffu und diffy auf die Diff-Parameter -c, -u und -y, diff, wdiff und debdiff auf die entsprechenden Tools.

Abbildung 7 zeigt einen Aufruf von Colordiff, in dem es die Ausgabe von Debdiff (aus dem Debian-Paket devscripts [13]) explizit einfärbt. Debdiff vergleicht hier zwei Versionen des Debian-Pakets xpenguins miteinander und gibt die Unterschiede zwischen den beiden Paketen aus.

Abbildung 7: Noch mehr Farbenspiele erm&ouml;glichen Colordiff und Debdiff.

Abbildung 7: Noch mehr Farbenspiele ermöglichen Colordiff und Debdiff.

Werkzeugkasten

Die Liste der Werkzeuge zum Vergleichen von Dateien ließe sich noch fast beliebig fortsetzen, Um die Sache abzukürzen, beschränken wir uns hier darauf, jeweils noch einen Vertreter aus den beiden Kategorien “Tools mit graphischer Oberfläche” und “Webbasierte Werkzeuge” vorzustellen.

In die erste Rubrik gehören Xdiff, Xxdiff, Fldiff, Tkdiff und Eskil [14]. Die ersten vier gehören quasi alle zur selben Familie und unterscheiden sich nur bezüglich des verwendeten Toolkits für die grafische Bedienoberfläche, nicht aber in der Funktion. Abbildung 8 zeigt Tkdiff und stellt die Unterschiede zwischen den beiden Dateien regionen1 und regionen2 heraus. Die Anzeige ähnelt jener der bereits besprochenen Kandidaten Meld und Kdiff3.

Abbildung 8: Tkdiff basiert auf Tk/Tcl und arbeitet im Prinzip wie viele andere Oberfl&auml;chen f&uuml;r Diff.

Abbildung 8: Tkdiff basiert auf Tk/Tcl und arbeitet im Prinzip wie viele andere Oberflächen für Diff.

In der Kategorie der browserbasierten Lösungen finden Sie etwa Diffchecker [15], Text Compare [16], Diff Now [17] sowie Code Diff [18] und Quickdiff [19]. Bei allen laden Sie den zu vergleichenden Text entweder hoch oder kopieren ihn in ein Eingabefenster. Danach starten Sie per Mausklick den Vergleich. Während Diffchecker, Text Compare und Diff Now (Abbildung 9) nur zeilenweise vergleichen, bieten Code Diff und Quickdiff die Möglichkeit, wortweise zu prüfen.

Abbildung 9: Wer ohnehin viel im Web unterwegs ist, greift beim Vergleich zu Tools wie Diff Now.

Abbildung 9: Wer ohnehin viel im Web unterwegs ist, greift beim Vergleich zu Tools wie Diff Now.

Fazit

Unterschiede zwischen mehreren Textdateien lassen sich mit den richtigen Tools recht unkompliziert herausarbeiten. Die hier vorgestellten Diff-Werkzeuge lassen Ihnen die Wahl, im Terminal oder in der grafischen Oberfläche zu agieren.

In der nächsten Folge dieser kleinen Serie werden Werkzeuge im Mittelpunkt stehen, die sich auf spezielle, strukturierte Formate ausrichten. Damit gelingt es Ihnen leichter, Unterschiede in CSV-, XML- und JSON-Daten zu entdecken. (jlu)

Die Autoren

Frank Hofmann arbeitet zumeist von unterwegs aus als Entwickler, Trainer und Autor. Bevorzugte Arbeitsorte sind Berlin, Genf und Kapstadt. Axel Beckert, Linux-Sysadmin und Spezialist für Netzwerksicherheit bei den Informatikdiensten der ETH Zürich, engagiert sich nebenher ehrenamtlich bei Debian, in der LUG Switzerland, beim Podcast Hackerfunk sowie bei diversen Open-Source-Projekten.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 11/2021 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben