Wie vergleiche ich zwei Textdateien im Linux-Terminal?

Sie möchten die Unterschiede zwischen zwei Revisionen einer Textdatei sehen? Diff ist also der Befehl, den Sie brauchen. Dieses Tutorial zeigt Ihnen, wie Sie diff unter Linux und macOS am einfachsten verwenden.

Contents

Verschiedene Befehle zur Verfügung

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üssen, damit sie mit der zweiten Datei übereinstimmt. Wenn Sie dies berücksichtigen, können Sie die Ausgabe von diff leichter verstehen.

Der Befehl diff wurde entwickelt, um Unterschiede zwischen Quellcodedateien zu finden und eine Ausgabe zu erzeugen, die von anderen Programmen gelesen und verwendet werden kann, wie beispielsweise dem Befehl patch. In diesem Tutorial werden wir uns die nützlichsten und benutzerfreundlichsten Möglichkeiten zur Verwendung von diff ansehen.

Lassen Sie uns eintauchen und zwei Dateien analysieren. Die Reihenfolge der Dateien in der Befehlszeile bestimmt, welche Diff-Datei als „erste Datei“ und welche Diff-Datei als „zweite Datei“ betrachtet wird. Im folgenden Beispiel ist alpha1 die erste Datei und alpha2 die zweite. Beide Dateien enthalten das phonetische Alphabet, aber die zweite Datei, alpha2, wurde zusätzlich 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.

Linux

Wie sezieren wir diesen Ausgang? Wenn Sie wissen, wonach Sie suchen müssen, ist es nicht so schlimm. Jeder Unterschied wird wiederum 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 mittlere Buchstabe kann sein:

c: Die Zeile der ersten Datei sollte so geändert werden, dass sie der Zeile der zweiten Datei entspricht.

d: Die Zeile aus der ersten Datei muss entfernt werden, damit sie mit der zweiten Datei übereinstimmt.

a: Der ersten Datei müssen zusätzliche Inhalte hinzugefügt werden, damit sie mit der zweiten Datei übereinstimmen.

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 Dateien, die sich von den gefundenen unterscheiden.

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

Die nächste Änderung wird durch 12v12 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.

Die dritte Änderung bezieht sich auf eine Zeile, die aus alpha2 gelöscht wurde. Das 21d20-Tag wird als “Zeile 21 muss aus der ersten Datei gelöscht werden, damit beide Dateien aus Zeile 20 synchronisiert werden” entschlüsselt. Die Zeile <Uniform zeigt uns den Inhalt der Zeile, die aus alpha1 gelöscht werden soll.

Der vierte Unterschied ist mit 26a26,28 gekennzeichnet. Diese Änderung bezieht sich auf drei zusätzliche Zeilen, die zu alpha2 hinzugefügt wurden. Beachten Sie die 26.28 auf dem 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 der ersten Datei, Zeilen 26 bis 28 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).

Linux

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

Linux

Zu beachten ist, dass bei zwei identischen Dateien die Option -q (kurz) vollständig schließt und überhaupt nichts meldet.

Eine alternative Ansicht

Die Option -y (nebeneinander) verwendet ein anderes Layout, um 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 unansehnliche Zeilenumbrüche vermieden, die die Lesbarkeit der Ausgabe erschweren. Hier haben wir diff angewiesen, eine Side-by-Side-Anzeige zu erstellen und die Ausgabe auf 70 Spalten zu beschränken.

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

|: Eine Zeile, die in der zweiten Datei geändert wurde.
<: Eine Zeile, die aus der zweiten Datei gelöscht wurde.

: Eine Zeile, die der zweiten Datei hinzugefügt wurde, die sich nicht in der ersten Datei befindet.

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

Linux

Füge einen Farbtupfer hinzu

Ein weiteres Dienstprogramm namens colordiff fügt der Ausgabe des diff 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.

Verwenden Sie colordiff genau so, wie Sie es auch tun würden.

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

Bereitstellung von Kontext für Linux

Um einen Kompromiss zwischen der Anzeige aller Zeilen der Dateien auf dem Bildschirm und der Auflistung nur der geänderten Zeilen zu finden, können wir diff bitten, etwas Kontext bereitzustellen.

Es gibt zwei Möglichkeiten, dies zu tun. Beide Wege erfüllen denselben Zweck, nämlich einige Zeilen vor und nach jeder geänderten Zeile anzuzeigen. Sie können sehen, was in der Datei passiert, in der der Unterschied festgestellt wurde.

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

Die Differenznachricht hat einen Header. Die Kopfzeile listet die beiden Dateinamen und ihre Änderungszeiten auf. Vor dem ersten Dateinamen stehen Sternchen (*) und vor dem zweiten Dateinamen Bindestriche (-). Sternchen und Bindestriche werden verwendet, um anzugeben, zu welcher Datei die Zeilen der Ausgabe gehören.

Eine Sternchenlinie mit 1,7 in der Mitte zeigt an, dass wir Linien von alpha1 sehen. Um genau zu sein, betrachten wir die Zeilen 1 bis 7. Das Wort Delta ist als geändert gekennzeichnet. Es hat ein Ausrufezeichen (!) daneben und es 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 gestrichelte Linie mit 1,7 in der Mitte sagt uns, dass wir jetzt Linien von alpha2 sehen. Wieder sehen wir uns die Zeilen 1 bis 7 an, wobei das Wort Dave in Zeile 4 anders markiert ist.

Drei Zeilen Kontext über und unter jeder Änderung sind die Standardeinstellung. Sie können angeben, wie viele Kontextzeilen Sie unterscheiden möchten. Verwenden Sie dazu die Option -C (kopierter Kontext) mit einem Großbuchstaben ‘C’ und geben Sie die gewünschte Zeilenanzahl an:

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

Wie zuvor haben wir einen Header in 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 Alpha 1 zu verweisen und Pluszeichen, um auf Alpha 2 zu verweisen. In der gesamten Liste befinden sich Zeilen, die mit Vorzeichen (@) beginnen. Diese Linien markieren den Anfang jedes Unterschieds. Sie sagen uns auch, welche Zeilen von jeder Datei angezeigt werden.

Uns werden die drei Zeilen vor und nach der als unterschiedlich markierten 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.

Vor der alpha1-Zeile steht ein Strich und vor der alpha2-Zeile ein Pluszeichen. Dieser Bildschirm erreicht in acht Zeilen, was der vorher kopierte Kontextbildschirm fünfzehn Minuten gedauert hat.

Wie Sie vielleicht erwarten, können wir diff bitten, uns genau die Anzahl der Zeilen des einheitlichen Kontexts zur Verfügung zu stellen, die wir sehen möchten. Verwenden Sie dazu die Option -U (Unified Context) mit einem Großbuchstaben “U” und geben Sie die gewünschte Zeilenanzahl an:

Leerzeichen in Linux ignorieren

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

Die Ergebnisse zeigen, dass diff bei den Linien Black Widow, Spider-Man und Thor nichts anderes findet. Nimmt Änderungen mit Linien von Captain America, Ironman und The Hulk vor.

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”.

Okay, leicht zu erkennen, aber was ist mit der Ironman-Linie los? Es gibt keine sichtbaren Unterschiede. Hier ist eine gute Faustregel. Wenn Sie es nicht sehen können, ist die Antwort ein Leerzeichen. Am Ende dieser Zeile fehlen mit ziemlicher Sicherheit ein oder zwei Leerzeichen oder ein Tabulatorzeichen.

Wenn Sie sich nicht für sie interessieren, können Sie diff anweisen, bestimmte Arten von Linienunterschieden zu ignorieren, einschließlich:

-i: Unterschiede bei Groß-/Kleinschreibung ignorieren.
-Z: Ignorieren Sie die folgenden Leerzeichen.
-b: Ignoriert Änderungen in der Menge des Leerraums.
-w: Eliminiert alle Whitespace-Änderungen.

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

Die Zeilen mit “The Hulk” und “The Hulk” gelten jetzt als Übereinstimmung, und es gibt keinen Unterschied für das kleine “h”. Lassen Sie uns diff bitten, auch das abschließende Leerzeichen zu ignorieren.

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

Indem wir diff anweisen, 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 auf der Linux-Manpage überprüft werden.

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