So vergleichen Sie zwei Textdateien im Linux-Terminal

Sie möchten die Unterschiede zwischen zwei Revisionen einer Textdatei sehen? Dann ist diff der Befehl, den Sie brauchen. Dieses Tutorial zeigt Ihnen, wie Sie diff auf einfache Weise unter Linux und macOS verwenden.

Eintauchen in diff

Der Befehl diff vergleicht zwei Dateien und erstellt eine Liste der Unterschiede zwischen den beiden. Genauer gesagt erstellt es eine Liste der Änderungen, die an der ersten Datei vorgenommen werden müssten, damit sie mit der zweiten Datei übereinstimmt. Wenn Sie dies im Hinterkopf behalten, wird es Ihnen leichter fallen, die Ausgabe von diff zu verstehen. Der Befehl diff wurde entwickelt, um Unterschiede zwischen Quellcodedateien zu finden und eine Ausgabe zu erzeugen, die von anderen Programmen gelesen und verarbeitet werden kann, wie z Patch Befehl. In diesem Tutorial werden wir uns die nützlichsten und benutzerfreundlichsten Möglichkeiten zur Verwendung von diff ansehen.

Lassen Sie uns direkt eintauchen und zwei Dateien analysieren. Die Reihenfolge der Dateien auf der Befehlszeile bestimmt, welche Datei diff als „erste Datei“ und welche als „zweite Datei“ betrachtet. Im Beispiel unten ist alpha1 die erste Datei und alpha2 die zweite Datei. Beide Dateien enthalten die phonetisches Alphabet aber die zweite Datei, alpha2, wurde weiter bearbeitet, sodass die beiden Dateien nicht identisch sind.

Mit diesem Befehl können wir die Dateien vergleichen. Geben Sie diff, ein Leerzeichen, den Namen der ersten Datei, ein Leerzeichen, den Namen der zweiten Datei ein und drücken Sie dann die Eingabetaste.

diff alpha1 alpha2

Wie sezieren wir diese Ausgabe? Wenn Sie wissen, wonach Sie suchen müssen, ist es nicht so schlimm. Jeder Unterschied wird der Reihe nach in einer einzigen Spalte aufgelistet und jeder Unterschied wird beschriftet. Das Etikett enthält Zahlen auf beiden Seiten eines Buchstabens, z. B. 4c4. Die erste Zahl ist die Zeilennummer in alpha1 und die zweite Zahl ist die Zeilennummer in alpha2. Der Buchstabe in der Mitte kann sein:

c: Die Zeile in der ersten Datei muss geändert werden, damit sie mit der Zeile in der zweiten Datei übereinstimmt.
d: Die Zeile in der ersten Datei muss gelöscht werden, damit sie mit der zweiten Datei übereinstimmt.
a: Der ersten Datei muss zusätzlicher Inhalt hinzugefügt werden, damit sie mit der zweiten Datei übereinstimmt.

Die 4c4 in unserem Beispiel sagt uns, dass Zeile vier von alpha1 geändert werden muss, damit sie mit Zeile vier von alpha2 übereinstimmt. Dies ist der erste Unterschied zwischen den beiden gefundenen Dateien.

Zeilen, die mit beginnen, beziehen sich auf die zweite Datei, alpha2. Die Zeile Dave sagt uns, dass das Wort Dave der Inhalt von Zeile vier in alpha2 ist. Zusammenfassend müssen wir Delta in Zeile vier in alpha1 durch Dave ersetzen, damit diese Zeile in beiden Dateien übereinstimmt.

Die nächste Änderung wird durch die 12c12 angezeigt. Unter Anwendung der gleichen Logik sagt uns dies, dass Zeile 12 in alpha1 das Wort Lima enthält, aber Zeile 12 von alpha2 das Wort Linux enthält.

  So richten Sie RocketChat Server unter Linux ein

Die dritte Änderung bezieht sich auf eine Zeile, die aus alpha2 gelöscht wurde. Das Label 21d20 wird als „Zeile 21 muss aus der ersten Datei gelöscht werden, damit beide Dateien ab Zeile 20 synchronisiert werden“ entziffert. Die

Der vierte Unterschied ist mit 26a26,28 bezeichnet. Diese Änderung bezieht sich auf drei zusätzliche Zeilen, die zu alpha2 hinzugefügt wurden. Beachten Sie die 26,28 im Etikett. Zweizeilige Nummern, die durch ein Komma getrennt sind, stellen einen Bereich von Zeilennummern dar. In diesem Beispiel reicht der Bereich von Zeile 26 bis Zeile 28. Das Label wird interpretiert als „in Zeile 26 in der ersten Datei, Zeilen 26 bis 28 aus der zweiten Datei hinzufügen“. Uns werden die drei Zeilen in alpha2 gezeigt, die zu alpha1 hinzugefügt werden müssen. Diese enthalten die Wörter Quirk, Strange und Charm.

Bissige Einzeiler

Wenn Sie nur wissen möchten, ob zwei Dateien gleich sind, verwenden Sie die Option -s (identische Dateien melden).

diff -s alpha1 alpha3

Sie können die Option -q (kurz) verwenden, um eine ebenso knappe Aussage darüber zu erhalten, dass zwei Dateien unterschiedlich sind.

diff -q alpha1 alpha2

Eine Sache, auf die Sie achten sollten, ist, dass bei zwei identischen Dateien die Option -q (kurz) vollständig stillsteht und überhaupt nichts meldet.

Eine alternative Ansicht

Die Option -y (nebeneinander) verwendet ein anderes Layout, um die Dateiunterschiede zu beschreiben. Es ist oft praktisch, die Option -W (Breite) mit der Side-by-Side-Ansicht zu verwenden, um die Anzahl der angezeigten Spalten zu begrenzen. Dadurch werden hässliche Zeilenumbrüche vermieden, die die Lesbarkeit der Ausgabe erschweren. Hier haben wir diff angewiesen, eine Anzeige nebeneinander zu erzeugen und die Ausgabe auf 70 Spalten zu begrenzen.

diff -y -W 70 alpha1 alpha2

Die erste Datei in der Befehlszeile, alpha1, wird links angezeigt, und die zweite Zeile der Befehlszeile, alpha2, wird rechts angezeigt. Die Zeilen aus jeder Datei werden nebeneinander angezeigt. Neben den Zeilen in alpha2, die geändert, gelöscht oder hinzugefügt wurden, befinden sich Hinweiszeichen.

|: Eine Zeile, die in der zweiten Datei geändert wurde.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: Eine Zeile, die der zweiten Datei hinzugefügt wurde, die sich nicht in der ersten Datei befindet.

Wenn Sie eine kompaktere Zusammenfassung der Dateiunterschiede nebeneinander bevorzugen, verwenden Sie die Option –suppress-common-lines. Dadurch wird diff gezwungen, nur die geänderten, hinzugefügten oder gelöschten Zeilen aufzulisten.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

Füge einen Farbtupfer hinzu

Ein weiteres Dienstprogramm namens colordiff fügt der Diff-Ausgabe Farbhervorhebungen hinzu. Dadurch ist es viel einfacher zu erkennen, welche Linien Unterschiede aufweisen.

Verwenden Sie apt-get, um dieses Paket auf Ihrem System zu installieren, wenn Sie Ubuntu oder eine andere Debian-basierte Distribution verwenden. Verwenden Sie bei anderen Linux-Distributionen stattdessen das Paketverwaltungstool Ihrer Linux-Distribution.

sudo apt-get install colordiff

Verwenden Sie colordiff genauso wie diff.

  So verwenden Sie den Buttercup-Passwortmanager unter Linux

Tatsächlich ist colordiff ein Wrapper für diff, und diff erledigt die ganze Arbeit hinter den Kulissen. Aus diesem Grund funktionieren alle diff-Optionen mit colordiff.

Bereitstellung eines Kontexts

Um einen Mittelweg zwischen der Anzeige aller Zeilen in den Dateien auf dem Bildschirm und der Auflistung nur der geänderten Zeilen zu finden, können wir diff bitten, etwas Kontext bereitzustellen. Dazu gibt es zwei Möglichkeiten. Beide Wege erreichen den gleichen Zweck, nämlich einige Zeilen vor und nach jeder geänderten Zeile anzuzeigen. Sie können sehen, was in der Datei an der Stelle vorgeht, an der der Unterschied festgestellt wurde.

Die erste Methode verwendet die Option -c (kopierter Kontext).

colordiff -c alpha1 alpha2

Die diff-Ausgabe hat einen Header. Die Kopfzeile listet die beiden Dateinamen und ihre Änderungszeiten auf. Es gibt Sternchen

vor dem Namen der ersten Datei und Bindestriche (-) vor dem Namen der zweiten Datei. Sternchen und Bindestriche werden verwendet, um anzugeben, zu welcher Datei die Zeilen in der Ausgabe gehören.

Eine Sternchenreihe mit 1,7 in der Mitte zeigt an, dass es sich um Linien von alpha1 handelt. Um genau zu sein, betrachten wir die Zeilen eins bis sieben. Das Wort Delta wird als geändert gekennzeichnet. Es hat ein Ausrufezeichen ( ! ) daneben und ist rot. Vor und nach dieser Zeile werden drei Zeilen mit unverändertem Text angezeigt, damit wir den Kontext dieser Zeile in der Datei sehen können.

Die Strichlinie mit 1,7 in der Mitte sagt uns, dass wir jetzt Linien von alpha2 betrachten. Wieder sehen wir uns die Zeilen eins bis sieben an, wobei das Wort Dave in Zeile vier als anders gekennzeichnet ist.

colordiff -C 2 alpha1 alpha2

Drei Zeilen Kontext über und unter jeder Änderung sind der Standardwert. Sie können angeben, wie viele Kontextzeilen diff bereitstellen soll. Verwenden Sie dazu die Option -C (kopierter Kontext) mit einem großen „C“ und geben Sie die gewünschte Zeilenanzahl an:

colordiff -u alpha1 alpha2

Die zweite diff-Option, die Kontext bietet, ist die Option -u (unified context).

Wie zuvor haben wir einen Header auf der Ausgabe. Die beiden Dateien werden benannt und ihre Änderungszeiten werden angezeigt. Es gibt Bindestriche (-) vor dem Namen von alpha1 und Pluszeichen (+) vor dem Namen von alpha2. Dies sagt uns, dass Bindestriche verwendet werden, um auf alpha1 zu verweisen und Pluszeichen, um auf alpha2 zu verweisen. Über die gesamte Auflistung verstreut sind Zeilen, die mit at-Zeichen (@) beginnen. Diese Linien markieren den Beginn jedes Unterschieds. Sie sagen uns auch, welche Zeilen von jeder Datei angezeigt werden.

Uns werden die drei Zeilen vor und nach der als unterschiedlich gekennzeichneten Zeile angezeigt, damit wir den Kontext der geänderten Zeile sehen können. In der einheitlichen Ansicht werden die Zeilen mit dem Unterschied übereinander angezeigt. Der Zeile von alpha1 ist ein Bindestrich vorangestellt und der Zeile von alpha2 ist ein Pluszeichen vorangestellt. Diese Anzeige erreicht in acht Zeilen das, wofür die obige kopierte Kontextanzeige fünfzehn benötigte.

colordiff -U 2 alpha1 alpha2

Wie zu erwarten, können wir diff bitten, genau die Anzahl der Zeilen des vereinheitlichten Kontexts anzugeben, die wir sehen möchten. Verwenden Sie dazu die Option -U (Unified Context) mit einem großen „U“ und geben Sie die gewünschte Zeilenanzahl an:

Leerzeichen und Groß-/Kleinschreibung ignorieren

colordiff -y -W 70 test4 test5

Lassen Sie uns zwei weitere Dateien analysieren, test4 und test5. Diese haben die Namen sechs von Superhelden in ihnen.

  So installieren Sie Bitcoin-Knoten unter Linux

Die Ergebnisse zeigen, dass diff bei den Linien Black Widow, Spider-Man und Thor nichts anderes findet. Es zeigt Änderungen bei den Linien Captain America, Ironman und The Hulk an.

Was ist also anders? Nun, in test5 wird Hulk mit einem kleinen „h“ geschrieben und Captain America hat ein zusätzliches Leerzeichen zwischen „Captain“ und „America“. OK, das ist klar, aber was ist an der Ironman-Linie falsch? Es gibt keine sichtbaren Unterschiede. Hier ist eine gute Faustregel. Wenn Sie es nicht sehen können, lautet die Antwort Leerzeichen. Es gibt mit ziemlicher Sicherheit ein oder zwei verirrte Leerzeichen oder ein Tabulatorzeichen am Ende dieser Zeile.

Wenn sie für Sie nicht wichtig sind, können Sie diff anweisen, bestimmte Arten von Linienunterschieden zu ignorieren, einschließlich:
-i: Unterschiede bei Groß-/Kleinschreibung ignorieren.
-Z: Nachgestellte Leerzeichen ignorieren.
-b: Ignoriert Änderungen in der Menge des Leerraums.

-w: Alle Änderungen an Leerzeichen ignorieren.

colordiff -i -y -W 70 test4 test5

Lassen Sie uns diff bitten, diese beiden Dateien erneut zu überprüfen, diesmal jedoch alle Unterschiede zu ignorieren.

colordiff -i -Z -y -W 70 test4 test5

Die Zeilen mit „The Hulk“ und „The Hulk“ werden jetzt als Übereinstimmung betrachtet, und für das kleine „h“ wird kein Unterschied angezeigt. Lassen Sie uns diff bitten, auch nachgestellte Leerzeichen zu ignorieren.

colordiff -i -w -y -W 70 test4 test5

Wie vermutet, muss der nachfolgende Leerraum der Unterschied auf der Ironman-Linie gewesen sein, da diff keinen Unterschied mehr für diese Linie anzeigt. Damit bleibt Captain America. Lassen Sie uns diff bitten, die Groß-/Kleinschreibung zu ignorieren und alle Probleme mit Leerzeichen zu ignorieren.

Indem wir diff anweisen, die Unterschiede zu ignorieren, die uns nicht interessieren, sagt uns diff, dass die Dateien für unsere Zwecke übereinstimmen. Der Befehl diff hat viele weitere Optionen, aber die meisten davon beziehen sich auf die Erzeugung einer maschinenlesbaren Ausgabe. Diese können unter Linux eingesehen werdenman-Seite

. Die Optionen, die wir in den obigen Beispielen verwendet haben, ermöglichen es Ihnen, alle Unterschiede zwischen den Versionen Ihrer Textdateien mithilfe der Befehlszeile und des menschlichen Auges aufzuspüren.