GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden des Diff-Befehls zum Vergleichen zweier Dateien im Linux-Terminal

Wenn Sie unter Linux zwei Dateien mit ähnlichem Text vergleichen müssen, kann die Verwendung des diff-Befehls Ihre Aufgabe erheblich erleichtern. Der Befehl vergleicht zwei Dateien, um Änderungen vorzuschlagen, die die Dateien identisch machen würden. Großartig, um die zusätzliche geschweifte Klammer zu finden, die Ihren neu aktualisierten Code beschädigt hat.

Die Verwendung des diff-Befehls ist sehr einfach. Hier ist die Syntax:

diff [options] file1 file2

Aber seine Ausgabe zu verstehen, ist eine andere Sache. Keine Sorge, ich erkläre die Ausgabe, damit Sie zwei Dateien vergleichen und den Unterschied zwischen ihnen verstehen können.

Diff-Befehl in Linux verstehen

Sie benötigen ein paar Dateien, um loszulegen. Ich habe mit einem Zufallswortgenerator eine Liste erstellt.

Ich habe die Liste zu zwei verschiedenen Dateien hinzugefügt und dann die Liste geändert durch:

  • Listenreihenfolge ändern
  • Buchstaben hinzufügen
  • Fall wechseln

Ich habe diese ähnlichen Dateien als 1.txt und 2.txt gespeichert. So sehen sie aus, bevor Sie etwas tun.

Ich schlage vor, dass Sie beim Lesen dem Tutorial folgen, also erstellen Sie bitte neue Dateien und fügen Sie ihnen den folgenden Inhalt hinzu.

Inhalt von 1.txt :

Spinnennetz
Medaillon
Akustik
Erweiterung
aufnehmen

Inhalt von 2.txt:

Spinnennetz
MEDAILLON
Akustik
Aufzeichnungen
Erweiterung

Beispiel 1:Diff ohne Optionen

Mal sehen, was passiert, wenn Sie diff ausführen Befehl ohne Optionen.

christopher:~$ diff 1.txt 2.txt
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

Verwirrt? Du bist nicht allein. Die Ausgabe ist nicht gerade menschenfreundlich. Um zu verstehen, was vor sich geht, müssen Sie mehr darüber wissen, wie diff funktioniert.

Es kann hilfreich sein zu wissen, dass nach Abschluss der Analyse file2 [in der Syntax] wird als Referenzdokument behandelt, mit dem Sie versuchen, eine Übereinstimmung herzustellen. Man könnte also sagen, dass diff so funktioniert:

diff <file_to_edit> <file_as_reference>

Das bedeutet auch, dass Sie abhängig von der Reihenfolge, in der Sie die Dateinamen platzieren, unterschiedliche Ausgaben erhalten.

Auf die Reihenfolge kommt es an

Ein Beispiel dafür, wie sich die Ausgabe je nach Dateireihenfolge unterscheidet:

christopher:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

christopher:~$ diff 2.txt 1.txt 
2c2
< LOCKET
---
> locket
4d3
< records
5a5
> record

Wichtige Symbole in der diff-Befehlsausgabe

Anhand der folgenden Tabelle als Referenz können Sie besser verstehen, was in Ihrem Terminal vor sich geht.

Symbol Bedeutung
A Hinzufügen
C Ändern
D Löschen
# Zeilennummern
– – – Trennt Dateien in der Ausgabe
< Datei 1
> Datei 2

Schauen wir uns noch einmal die Ausgabe des diff-Befehls an:

christopher:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

Erklärung der diff-Befehlsausgabe

Sehen wir uns den ersten Unterschied in der Ausgabe an:

Ausgabezeile Erklärung
2c2 Zeile 2 von Datei 1, CHANGE mit Zeile 2 von Datei 2.
MEDAILLON Ändern Sie „locket“ in „LOCKET“, um mit Datei 2.txt übereinzustimmen

Schauen wir uns den nächsten Teil der Ausgabe an:

Ausgabezeile Erklärung
3a4 Fügen Sie nach Zeile 3 von Datei 1 Zeile 4 von Datei 2 hinzu.
> Datensätze Das bedeutet, „Einträge“ hinzuzufügen, um die vierte Zeile in Datei 1 zu erstellen. Damit Datei 1.txt mit Datei 2.txt übereinstimmt

Ähnlich:

Ausgabezeile Erklärung
5d5 Löschen Sie den Text „record“ aus der 5. Zeile von Datei 1. Damit Datei 1.txt mit Datei 2.txt übereinstimmt

In den Befehl ist keine Rechtschreibprüfung oder Wörterbuchfunktion integriert. Es erkennt „record“ und „records“ nicht als verwandt. Sein einziges Ziel ist es, die beiden Dateien perfekt aufeinander abzustimmen.

Wenn man sich die Ausgabe ansieht, ist es immer noch ziemlich schwer zu übersetzen. Es ist unwahrscheinlich, dass Sie viel Zeit sparen würden.

Glücklicherweise gibt es Optionen, die hinzugefügt werden können, um die Dinge für Menschen lesbarer zu machen. Sehen wir uns ein paar verschiedene Beispiele an, die dieselbe Liste verwenden.

Beispiel 2:Vergleich im „Copied“-Kontext mit -c

Die Kontextoption bietet eine visuellere Darstellung der standardmäßig angezeigten programmatischeren Informationen. Fahren wir mit unserem Beispieltext fort.

Wichtigere Symbole in der diff-Befehlsausgabe

Symbol Bedeutung
+ Hinzufügen
! Ändern
Löschen
*** Datei 1
– – – Datei 2
christopher:~$ diff -c 1.txt 2.txt 
*** 1.txt    2019-10-20 12:05:09.244673327 -0400
--- 2.txt    2019-10-20 12:11More:31.382547316 -0400
***************
*** 1,5 ****
  cobweb
! locket
  acoustics
  expansion
- record
--- 1,5 ----
  cobweb
! LOCKET
  acoustics
+ records
  expansion

Es ist viel einfacher zu verstehen, wenn Sie die Informationen auf diese Weise sehen. Anstelle der alphanumerischen Ausgabe hilft Ihnen der neue Symbolsatz, die Unterschiede zwischen den beiden Dateien schnell zu erkennen.

Die Ausgabe zeigt zuerst die erste Datei, d.h. 1.txt und ihre Zeile von 1 bis 5. Es besagt, dass es eine leichte Änderung in (einem Teil von) Zeile 2 der Datei 1.txt und (einem Teil von) Zeile 2 von Datei 2 gibt .txt.

Es zeigt auch an, dass Zeile Nummer 5 von Datei 1 in der zweiten Datei gelöscht wurde (-).

— 1,5 —- gibt den Beginn der zweiten Datei an und besagt, dass Zeile 2 gegenüber Zeile 2 von Datei 1 geringfügig geändert wurde. Es zeigt auch an, dass Zeile 4 in der zweiten Datei hinzugefügt wurde (+) und es keine Entsprechung gibt Zeile in Datei 1.

Beispiel 3:Diff im „Unified“-Kontext mit -u

Diese Option bietet eine ähnliche Ausgabe wie das kopierte Kontextformat. Anstatt die beiden Dateien separat anzuzeigen, werden sie zusammengeführt.

christopher:~$ diff 1.txt 2.txt -u
--- 1.txt    2019-10-20 12:05:09.244673327 -0400
+++ 2.txt    2019-10-20 12:11:31.382547316 -0400
@@ -1,5 +1,5 @@
 cobweb
-locket
+LOCKET
 acoustics
+records
 expansion
-record

Wie Sie sehen können, verwendet es die gleichen Symbole wie zuvor, aber anstelle des Änderungssymbols schlägt es Änderungen vor, die mit leicht lesbarem + vorgenommen werden sollen oder - Symbole. Hier empfiehlt es sich, Zeile 2 aus 1.txt zu entfernen und ersetzen Sie sie durch Zeile 2 aus 2.txt .

Für die Zukunft wird außerdem vorgeschlagen, dass Sie Datensätze hinzufügen hinter Zeile mit Akustik und Zeile record löschen nach der Zeile mit der Erweiterung.

All diese Änderungen werden für die erste Datei im diff-Befehl vorgeschlagen. Dies ist ein weiteres Szenario, bei dem es hilfreich ist, sich daran zu erinnern, dass das Diff-Programm die zweite aufgeführte Datei als „Original“ oder Grundlage für Korrekturen verwendet.

Um eine solche Liste zu vergleichen, finde ich persönlich diese Methode am einfachsten zu verwenden. Es gibt Ihnen eine klare Visualisierung des Textes, der geändert werden muss, um die Dateien identisch zu machen.

Beispiel 4:Vergleiche, aber ignoriere Fälle mit -i

Suchen mit Berücksichtigung der Groß- und Kleinschreibung sind die Standardeinstellung für diff, aber Sie können dies deaktivieren. Sehen wir uns an, was passiert, wenn Sie das tun.

christopher:~$ diff 1.txt 2.txt -i
3a4
> records
5d5
< record

Wie Sie sehen können, werden „Medaillon“ und „LOCKET“ nicht mehr als vorgeschlagene Änderungen aufgeführt.

Beispiel 5:Diff mit –color

Sie können --color verwenden , um Änderungen in der Ausgabe des diff-Befehls hervorzuheben. Wenn der Befehl ausgeführt wird, werden Abschnitte der Ausgabe in verschiedenen Farben aus der Terminal-Palette gedruckt.

Beispiel 6:Schnellanalyse von Dateien mit den diff-Befehlsoptionen -s und -q

Es gibt ein paar einfache Möglichkeiten, um zu überprüfen, ob Dateien identisch sind oder nicht. Wenn Sie -s verwenden es wird Ihnen sagen, dass die Dateien identisch sind, oder es wird wie gewohnt diff ausgeführt.

Mit -q wird Ihnen nur sagen, dass die Dateien „unterschiedlich“ sind. Wenn dies nicht der Fall ist, erhalten Sie keine Ausgabe.

christopher:~$ diff 1.txt 1.txt -s
Files 1.txt and 1.txt are identical
christopher:~$ diff 1.txt 2.txt -q
Files 1.txt and 2.txt differ

Bonus-Tipp:Verwendung des diff-Befehls in Linux mit großen Textdateien

Möglicherweise vergleichen Sie nicht immer so einfache Informationen. Möglicherweise müssen Sie große Textdateien durchsuchen und Unterschiede finden. Ich werde einige Methoden zur Behandlung dieser Art von Problemen erläutern.

Für dieses Beispiel habe ich zwei Dateien mit großen Textblöcken (lorem ipsum) erstellt. Jede Zeile hat Hunderte von Spalten. Dies erschwerte offensichtlich den Linienvergleich.

Wenn diff für eine Datei wie diese ausgeführt wird, erzeugt die Ausgabe riesige Textblöcke und die Symbole sind selbst mit Tools wie der kontextbezogenen Ausgabe schwer zu erkennen.

Um Platz zu sparen, habe ich einen Screenshot der Ausgabe gemacht, den Sie sich ansehen können.

Nicht sehr hilfreich, oder?

Sie können einige der gleichen Konzepte verwenden, um diese Art von Dateien zu analysieren. Sie werden nicht gut funktionieren, wenn die Datei nicht richtig formatiert ist. Einige große Textblöcke haben keine Zeilenumbrüche. Sie sind wahrscheinlich auf eine Datei wie diese gestoßen, bei der Sie „Wortumbruch“ aktivieren mussten, damit der gesamte Text innerhalb des zugewiesenen Bereichs angezeigt wird, ohne eine Bildlaufleiste zu verwenden. Der Grund dafür ist, dass einige Textformate Zeilenumbrüche nicht automatisch erstellen. So erhalten Sie die großen Textblöcke auf nur 2-3 Zeilen. Dafür gibt es eine ziemlich einfache Lösung.

Verwenden Sie fold, um Text in Zeilen umzubrechen

Dies ist das Linux-Handbuch, also haben wir natürlich eine Lösung für Sie und können ein Mini-Tutorial hineinstopfen. Hier finden Sie eine großartige Beschreibung zu Fold (Unix) und fmt (GNU). Ich gebe ein kurzes Beispiel, das jedoch ziemlich selbsterklärend sein sollte, um uns voranzubringen.

Der fold-Befehl wird verwendet, um Zeilen mit der Anzahl der Spalten zu brechen. Es kann angepasst werden, um Ihnen Optionen zu geben, wie diese neuen Zeilenumbrüche implementiert werden.

In diesem Beispiel werden Sie die Datei in eine standardisierte Breite aufteilen und das -s verwenden Möglichkeit. Dies weist das Programm an, NUR dort zu unterbrechen, wo es Leerzeichen gibt, nicht mitten im Text.

Verwenden Sie fold, um schnell Zeilenumbrüche einzufügen

fold -w 80 -s lorem.txt > lorem.txt
fold -w 80 -s lorem2.txt > lorem2.txt

Da beide Dateien in 31 statt in 3 Zeilen aufgeteilt sind, können Sie sie viel effektiver vergleichen. Hier ist ein Beispiel für Ihre Ausgabe mit dem einheitlichen Kontextfilter.

christopher:~$ diff lorem.txt 2lorem.txt -u
--- lorem.txt    2019-10-27 09:39:07.298691695 -0400
+++ 2lorem.txt    2019-10-27 09:39:08.370704501 -0400
@@ -1,10 +1,10 @@
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in tincidunt 
 sapien. Maecenas sagittis ex risus, in vehicula turpis imperdiet sed. Phasellus 
 placerat posuere maximus. In hac habitasse platea dictumst. Ut vel tristique 
-eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
+eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
 Suspendisse at mauris vitae sapien euismod tincidunt. Sed placerat finibus 
 blandit. Duis ornare ante at ipsum accumsan, nec bibendum nibh tincidunt. 
-Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
+Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
 vitae enim. Nam condimentum, purus nec semper efficitur, nisi quam vehicula 
 sem, eget finibus diam ipsum suscipit velit.

@@ -21,7 +21,7 @@

 Maecenas lacinia cursus tristique. Nulla a hendrerit orci. Donec lobortis nisi 
 sed ante euismod lobortis. Nullam sit amet est nec nunc porttitor sollicitudin 
-a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
+a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at 
 interdum mi metus vel tellus. Fusce nec dui a risus posuere mattis at eu orci. 
 Proin purus sem, finibus eget viverra vel, porta pulvinar ex. In hac habitasse 
 platea dictumst. Nunc faucibus leo nec tristique porta. Phasellus luctus ipsum

Diff mit –minimaler Ausgabe verwenden

Mit --minimal können Sie dies etwas lesbarer machen Schild. Dadurch werden größere Textdateien etwas besser lesbar. Schauen wir uns die Ausgabe an.

christopher:~$ diff lorem.txt 2lorem.txt --minimal
4c4
< eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
---
> eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
7c7
< Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
---
> Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
24c24
< a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
---
> a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at 

Sie können jeden dieser Tipps kombinieren oder einige der anderen Optionen verwenden, die auf den man-Seiten von diff aufgeführt sind. Dies ist ein leistungsstarkes und benutzerfreundliches Software-Dienstprogramm.

Ich hoffe, Sie fanden diesen Artikel nützlich. Wenn Sie einen Tipp haben, vergessen Sie nicht, uns einen Kommentar zu hinterlassen und uns davon zu erzählen.


Linux
  1. So führen Sie einen zeilenweisen Vergleich von Dateien in Linux mit dem Befehl diff durch - Teil II

  2. So führen Sie einen zeilenweisen Vergleich von Dateien in Linux mit dem Befehl diff durch

  3. So verbinden Sie zwei Textdateien unter Linux

  4. So finden Sie Dateien mit dem fd-Befehl in Linux

  5. 11 Linux diff3-Befehlsbeispiele (Vergleiche 3 Dateien Zeile für Zeile)

So kopieren Sie Dateien unter Linux mit dem CP-Befehl

Tutorial zur Verwendung des letzten Befehls im Linux-Terminal

Beispiele für Linux-Diff-Befehle

Vergleichen Sie zwei Dateien unter Linux – Verwenden Sie diff, vimdiff und colordiff

Cut auf Linux Terminal verwenden

Vergleichen von zwei Dateien im Linux-Terminal