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

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

Im ersten Teil dieser Anleitungsreihe zu diff-Befehlen haben wir die Grundlagen des Befehls besprochen, einschließlich seiner Funktionsweise und wie die von ihm erzeugte Ausgabe verstanden werden kann. Obwohl dieses Befehlszeilenprogramm definitiv eine gewisse Lernkurve erfordert, lohnt es sich, es zu lernen, insbesondere wenn Ihre tägliche Arbeit darin besteht, dateibezogene Aufgaben auf Linux-Rechnern auszuführen, die nur die CLI verwenden.

Unter der Annahme, dass Sie bereits die grundlegende Verwendung des Befehls diff kennen, werden wir in diesem Tutorial die verschiedenen Befehlszeilenoptionen, die das Tool bietet, anhand einiger leicht verständlicher Beispiele besprechen.

Aber bevor wir fortfahren, denken Sie daran, dass alle Beispiele in dieser Anleitung auf Ubuntu 14.04 mit Bash-Version 4.3.11(1) und Diff-Version 3.3 getestet wurden.

 

Diff-Befehlsoptionen

1. Melden Sie, wenn die Dateien identisch sind

Wenn der diff-Befehl feststellt, dass die verglichenen Dateien identisch sind, erzeugt er standardmäßig keine Ausgabe.

$ diff file1 file2
$

Aber es gibt eine Befehlszeilenoption (-s), mit der Sie den Befehl zwingen können, dies in der Ausgabe zu melden:

$ diff -s file1 file2
Files file1 and file2 are identical

2. Kopierter Kontext und vereinheitlichter Kontext

Dies sind im Grunde zwei verschiedene Formate, in denen der diff-Befehl seine Ausgabe erzeugen kann. Der kopierte Kontext wird mit der Befehlszeilenoption -c aktiviert, während der einheitliche Kontext mit -u aktiviert wird. Es folgt ein Beispiel für Ersteres:

$ diff -c file1 file2
*** file1 2016-12-29 09:36:47.175597647 +0530
--- file2 2016-12-29 09:19:55.799558326 +0530
***************
*** 1,3 ****
Hi
! Helllo
Bye
--- 1,3 ----
Hi
! Hello
Bye

Daher werden im Ausgabeformat Kopierter Kontext die unterschiedlichen Zeilen durch ein Ausrufezeichen (!) gekennzeichnet.

Und hier ist das Beispiel des einheitlichen Kontextformats:

$ diff -u file1 file2
--- file1 2016-12-29 09:36:47.175597647 +0530
+++ file2 2016-12-29 09:19:55.799558326 +0530
@@ -1,3 +1,3 @@
Hi
-Helllo
+Hello
Bye

In diesem Ausgabeformat + und - Symbole vor Zeilen kennzeichnen Versionen der abweichenden Zeile: '-' wenn Zeile in Datei1 fehlt in Datei 2 , '+' wenn Zeile in Datei 2 wurde zu Datei1. hinzugefügt

3. Geben Sie ein 'ed'-Skript aus

Der Befehl diff ist auch in der Lage, Befehle zu erzeugen, die der 'ed'-Editor verwenden kann, um die Originaldatei (Datei1 in unseren Beispielen hier) in die neue Datei (Datei2) zu konvertieren. So gehen Sie vor:

Angenommen, Datei1 und Datei2 enthalten die folgende Änderung:

$ diff file1 file2
2c2
< Helllo
---
> Hello

Verwenden Sie nun die Befehlszeilenoption -e, um die Ausgabe zu erzeugen, die der 'ed'-Editor versteht, und leiten Sie diese Ausgabe in eine Datei um:

diff -e file1 file2 > out

Hier ist, was out ist enthält in diesem Fall:

2c
Hello
.

Als nächstes müssen Sie den Befehl 'w' am Ende des out hinzufügen Datei.

2c
Hello
.
w

Führen Sie nun den folgenden Befehl aus:

ed - file1 < out

Und Sie werden sehen, dass Datei1 und Datei2 jetzt identisch sind.

$ diff file1 file2
$

Weitere Informationen zu dieser Funktion finden Sie hier.

4. Ausgabe in zwei Spalten erzeugen

Normalerweise erzeugt der diff-Befehl folgende Ausgabe:

$ diff file1 file2
2c2
< Helllo
---
> Hello

Aber es gibt eine Befehlszeilenoption (-y), die diff anweist, die Ausgabe in zwei separaten Spalten zu erzeugen. Hier ist ein Beispiel:

$ diff -y file1 file2
Hi                               Hi
Helllo                         | Hello
Bye                              Bye

Wie Sie sehen können, verwendet dieses Ausgabeformat ein '|' um Linien anzuzeigen, die unterschiedlich sind.

5. Gemeinsame Linien ausblenden

Wenn Sie die im vorherigen Abschnitt (Punkt 4 oben) gezeigte Ausgabe beobachten, werden Sie das mit -y bemerken Befehlszeilenoption diff - in der Ausgabe - erzeugt auch gemeinsame Zeilen. Falls Sie diese identischen Zeilen unterdrücken müssen, können Sie die --suppress-common-lines verwenden Option.

[email protected]:~$ diff -y --suppress-common-lines file1 file2
Helllo                                   | Hello

6. C-Funktion anzeigen, in der sich jede Änderung befindet 

Für Fälle, in denen Sie diff verwenden, um zwei C-Sprachdateien zu vergleichen, gibt es eine Befehlszeilenoption (-p), die das Dienstprogramm anweist, genau anzuzeigen, in welcher C-Funktion sich jede Änderung befindet. Angenommen, dies sind beispielsweise die beiden C-Dateien:

Datei1.c:

#include<stdio.h>

void compare(float x, float y)
{
if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
}


int main(void)
{
compare(1.234, 1.56789);

return 0;
}

file2.c:

#include<stdio.h>

void compare(float x, float y)
{
if(x == y)
{
printf("\n EQUAL \n");
}
}


int main(void)
{
compare(1.234, 1.56789);

return 0;
}

Hier ist die Ausgabe, wenn beide Dateien normal verglichen werden:

$ diff file1.c file2.c 
5c5
< if(x == y) // incorrect way
---
> if(x == y)

Und hier ist die Ausgabe, wenn die Dateien mit -p verglichen werden Möglichkeit:

$ diff -p file1.c file2.c 
*** file1.c 2016-12-29 11:45:36.587010816 +0530
--- file2.c 2016-12-29 11:46:39.823013274 +0530
***************
*** 2,8 ****

void compare(float x, float y)
{
! if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
--- 2,8 ----

void compare(float x, float y)
{
! if(x == y)
{
printf("\n EQUAL \n");
}

Also, wie Sie sehen können, mit -p , diff gibt Ihnen einen detaillierteren Überblick darüber, wo sich die Änderung befindet, und kennzeichnet die abweichenden Zeilen mit einem Ausrufezeichen (!).

7. Unterverzeichnisse rekursiv vergleichen

Mit dem diff-Befehl können Sie auch Unterverzeichnisse rekursiv vergleichen, aber das ist nicht das Standardverhalten. Was ich damit sagen will, ist, wenn Sie den folgenden Fall annehmen:

$ diff diff-files/ second-diff-files/
diff diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello

Der Befehl diff hat nur Dateien in den Verzeichnissen der obersten Ebene verglichen, aber wenn Sie die Befehlszeilenoption -r (für rekursiven Vergleich) verwenden, werden Sie sehen, dass sogar die Dateien in Unterverzeichnissen verglichen werden:

$ diff -r diff-files/ second-diff-files/
diff -r diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello
diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2
2c2
< Hello
---
> ello

8. Nicht vorhandene Dateien als leer behandeln

Der diff-Befehl bietet auch eine Option, mit der Sie das Tool anweisen können, fehlende Dateien als leer zu behandeln. Wenn Sie beispielsweise file1 mit file3 vergleichen (das nicht existiert), ist das Standardverhalten von diff, einen Fehler zu erzeugen:

$ diff file1 file3
diff: file3: No such file or directory

Das ist per se nicht falsch; in der Tat macht dies durchaus Sinn. Aber es könnte Fälle geben, in denen Sie nicht möchten, dass der diff-Befehl für solche Situationen einen Fehler auslöst (während er Teil eines Bash-Skripts ist, vielleicht?), dann können Sie für diese Szenarien die Befehlszeilenoption -N verwenden das zwingt den Befehl, fehlende Dateien als leer zu behandeln und mit dem Vergleich fortzufahren.

$ diff -N file1 file3
1,5d0
< Hi
<
< Helllo
<
< Bye

Schlussfolgerung

Wenn Sie beide Teile dieser Tutorial-Reihe gründlich durchgehen und alle Beispiele in den Artikeln üben, ist es nicht schwer zu sagen, dass Sie das Tool am Ende gut beherrschen. Natürlich konnten wir in dieser Serie nicht alles besprechen, was mit Diff zu tun hat, aber seien Sie versichert, dass viele der wichtigen Merkmale/Funktionalitäten behandelt wurden.

Für diejenigen, die mehr über das Dienstprogramm wissen möchten, ist die Manpage immer für Sie da. Und ganz zu schweigen davon, dass Sie das Tool häufig mit verschiedenen Dateisätzen verwenden sollten, um verschiedene Anwendungsfälle zu simulieren.


Linux
  1. So benennen Sie Dateien unter Linux um

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

  3. So starten Sie Linux über die Befehlszeile neu

  4. So sortieren Sie Dateien in Linux mit dem Sortierbefehl

  5. So zeigen Sie versteckte Dateien mit dem Linux-Befehl „find“ an

So benennen Sie Dateien über die Befehlszeile in Linux um

So vergleichen Sie Dateien unter Linux mit dem Tool Meld (Diff/Merge).

So kopieren Sie Dateien unter Linux mit dem CP-Befehl

So zählen Sie Dateien im Verzeichnis unter Linux

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

So laden Sie Dateien in Rocky Linux 8 über die Befehlszeile mit wget herunter