See the difference – Der „vimdiff“
Das folgende Szenario kann sich sicherlich jede:r Systemadministrator:in nur zu gut vorstellen: Die 1000 Zeilen lange Konfigurationsdatei „server.conf
“ soll mit der ebenfalls 1000 Zeilen langen Konfigurationsdatei „server.conf.old
“ verglichen werden, um einen Fehler im Produktivsystem zu finden. Nun gibt es grundsätzlich zwei Möglichkeiten: Entweder es ist einem das seltene Talent gegeben, durch ein „cat server.*“ die Änderung sofort zu sehen oder es kommt ein Tool zum Einsatz, das die Unterschiede beider Dateien markiert. Das Tool „vimdiff“ erledigt diese Arbeit sehr gut – und kann darüber hinaus noch mehr.
diff und sdiff
Diese beiden Linux-Tools sind die wohl bekanntesten zum Markieren von Unterschieden in Textdateien. Jede:r Systemadministrator:in hat sicherlich schon einmal eines davon verwendet. Jedoch fällt es gerade Neueinsteiger:innen häufig schwer, die Ausgabe eines „diff“- Kommandos korrekt zu interpretieren. An folgenden Beispieldateien soll dies demonstriert werden:
Datei A.txt
Das ist Zeile 1 Das ist Zeile 2 Hier steht eine weitere Zeile Weiterer Text befindet sich in dieser Zeile Genug Text für heute
Datei B.txt
Das ist Zeile 3 Das ist Zeile 2 Hier steht eine weitere Zeile Weiterer Text befindet sich in dieser Zeile und es wurde etwas ergänzt Genug Text für heute Diese Zeile wurde ergänzt
Die Unterschiede sind bei diesem Minimalbeispiel mit bloßem Auge erkennbar:
- In der ersten Zeile steht jeweils am Ende eine andere Ziffer
- Die dritte Zeile ist in der Datei
B.txt
eine Leerzeile - Die vierte Zeile in
A.txt
(bzw. die fünfte Zeile inB.txt
) enthält inB.txt
mehr Inhalt - Die letzte Zeile in
B.txt
existiert inA.txt
nicht
diff
Dieses Tool wird häufig zum schnellen Vergleich von zwei Dateien verwendet. Beim Aufruf generiert es folgende Ausgabe:
~$ diff A.txt B.txt 1c1 < Das ist Zeile 1 --- > Das ist Zeile 3 2a3 > 4c5 < Weiterer Text befindet sich in dieser Zeile --- > Weiterer Text befindet sich in dieser Zeile und es wurde etwas ergänzt 5a7 > Diese Zeile wurde ergänzt
1c1
“ bedeutet, dass die Änderung (c
) sich auf Zeile 1 der beiden Dateien A.txt
und B.txt
bezieht. Hinter dem Zeichen „<
“ steht der Inhalt der Zeile 1 aus der Datei, die als erstes Argument an den diff übergeben wurde (A.txt
) und hinter „>
“ steht der Inhalt der Zeile 1 aus der Datei, die als zweites Argument an den diff übergeben wurde (B.txt
).2a3
“ wird deutlich gemacht, dass nach Zeile 2 in A.txt
noch eine Zeile hinzugefügt (a
) wurde und dies die Zeile 3 in B.txt
ist. Nach dem Zeichen „>
“ steht der Inhalt der hinzugefügten Zeile in B.txt
, der leer ist.1c1
) verhält es sich mit „4c5
“ und den darauffolgenden Ausgaben. Die Abkürzung „4c5
“ bedeutet, dass ein Unterschied zwischen Zeile 4 in A.txt
und Zeile 5 in B.txt
existiert (Achtung: In B.txt
wurde eine leere Zeile eingefügt). Der Unterschied besteht darin, dass die Zeile um ein paar Wörter ergänzt wurde.B.txt
(diesmal mit Inhalt) ergänzt wurde. Dies lässt sich aus „5a7
“ ableiten.sdiff
Die Antwort lautet „Ja“. Ein Buchstabe mehr macht aus dem „diff“ ein „sdiff“ und erzeugt folgende Ausgabe:
$ sdiff A.txt B.txt Das ist Zeile 1 | Das ist Zeile 3 Das ist Zeile 2 Das ist Zeile 2 > Hier steht eine weitere Zeile Hier steht eine weitere Zeile Weiterer Text befindet sich in dieser Zeile | Weiterer Text befindet sich in dieser Zeile und es wurde etwa Genug Text für heute Genug Text für heute > Diese Zeile wurde ergänzt
Diese Art der Ausgabe ist schon etwas übersichtlicher, da hier geänderte bzw. ergänzte Zeilen direkt gegenübergestellt werden. Das „|
“ Zeichen bedeutet, dass in dieser Zeile eine Änderung vorliegt, während das „>
“ und „<
“ Zeichen jeweils auf eine ergänzte Zeile in einer der beiden Textdateien hinweist. Um noch bessere Ergebnisse zu erzielen, bietet „sdiff“ noch einige Optionen beim Aufruf, die in der entsprechenden man-Page ersichtlich sind.
So weit, so gut. Aber existiert nicht ein Tool, mit dem Änderungen grafisch angezeigt werden und bei Bedarf übernommen werden können?
vimdiff
Auch hier lautet die Antwort „Ja“. Der „vimdiff“ ist ein auf Basis des „vim“ basierendes Tool, mit dem sich Änderungen übersichtlich anzeigen lassen. Mit dem Aufruf vimdiff A.txt B.txt
erscheint folgende farbenfrohe Ausgabe:
Hier fallen selbst ungeübten Administrator:innen Unterschiede auf, da der „vimdiff“ die entsprechenden Stellen farblich markiert und die beiden Dateien nach ihrem Aufruf nebeneinander anzeigt. Die pinkfarbene Markierung der Zeile zeigt an, dass sich innerhalb der Zeile etwas geändert hat. Die rote Markierung innerhalb der pinken Markierung zeigt auch noch die genaue Stelle innerhalb der Zeile an. Gestrichelte, türkisfarbene Zeilen machen deutlich, dass die zu vergleichende Zeile aus der anderen Datei hier fehlt. In B.txt
existieren zwei Zeilen, die in A.txt
nicht existieren. Die dunkelblaue Markierung in B.txt
weist darauf hin.
Die Bedienung des „vimdiff“ orientiert sich dabei an der Bedienung des normalen „vim“. Um zwischen den beiden Dateien im Fenster zu wechseln, muss „STRG+WW“ eingegeben werden. Um gleichzeitig alle Dateien zu speichern oder zu schließen, muss ein „:wa“, bzw. „:qa“ eingegeben werden.
Beim Vergleichen von zwei Textdateien A.txt
und B.txt
ist es ebenfalls möglich, Änderungen zu übernehmen. Dazu wird in die betreffende Zeile von A.txt
navigiert, die eine Änderung aufweist. Die Änderung aus dem Dokument B.txt
kann mit „do
“ im Befehlsmodus übernommen werden. Soll die Zeile aus A.txt
nach B.txt kopieren, ist das Kommando „dp
“ zu nutzen.
Alle hier verwendeten und weitere Kommandos des „vim“ bzw. „vimdiff“ lassen sich im „Vim Cheat Sheet“1 nachlesen.
Fazit
Der „vimdiff“ ist ein mächtiges Werkzeug zum Vergleichen von zwei oder mehr Dateien. Durch die simple, an den „vim“ angelehnte Bedienung ist es möglich, durch minimalen Aufwand eine übersichtliche Darstellung sämtlicher Unterschiede zu erhalten. Bei Bedarf können die Änderungen schnell übernommen bzw. verworfen werden. Für Einsteiger:innen im Linux/Unix-Umfeld ist, sofern die Bedienung des „vim“ kein Problem darstellt, der „vimdiff“ ein hilfreiches Tool. Es müssen keine kryptischen Ausgaben entschlüsselt werden, um die Unterschiede von Dateien zu erkennen.
Senior Consultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare