Wie kann ich zwei Konfigurationsdateien unterscheiden?

15

Ich habe zwei snmpd.conf-Dateien, eine auf einem Server, der funktioniert, und eine, die nicht funktioniert. Wie kann ich die beiden Konfigurationsdateien unterscheiden, während irrelevante Kommentare und Zeilenumbrüche entfernt werden?

Jldugger
quelle
1
Pass auf, Jldugger! Du bist dabei level! =)
Xerxes
Es ist wirklich eine schlechte Idee, Kommentare zu entfernen. Woher weißt du, dass sie irrelevant sind, ohne sie anzusehen?
AnonymousLurker

Antworten:

15
diff <(grep -v '^#' f1) <(grep -v '^#' f2)

Um Leerzeilen und Zeilen, die nur Leerzeichen enthalten, zu vermeiden, zusätzlich zu identischen Zeilen, bei denen ein einziger Unterschied zwischen den vorangestellten Leerzeichen besteht ...

diff -b \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\
  <(grep -vE '^([ \t]*#|^[ \t]*$)' f2)

Zu diesem Zeitpunkt würde ich das wahrscheinlich in ein Skript schreiben und so etwas wie den ursprünglichen Vorschlag schreiben, der ein wenig lesbarer ist.

Xerxes
quelle
+1 für die Bereitstellung einer einzeiligen Lösung
wzzrd
Irgendwelche Ideen, wie auch Zeilen mit Leerzeichen weggelassen werden können? Wenn Sie Kommentare ausschneiden, werden sie durch viele Leerzeilen voneinander getrennt.
Jldugger
@jldugger, versuchen Sie, das grep so zu aktualisieren, dass Kommentare und Leerzeichen ausgeschlossen werden. - egrep -v '^ (#. * |) $'
Zoredache
19

Wenn Sie sich mit vim einigermaßen auskennen , empfehle ich Ihnen nachdrücklich, vimdiff zu verwenden :

vimdiff file1 file2

Dadurch wird eine vim-Sitzung mit zwei Fenstern mit einer Datei auf jeder Seite geöffnet. Hervorhebungen und Farben weisen auf Unterschiede zwischen den Dateien hin, und alle identischen Teile werden ausgeblendet (gefaltet, aber erweiterbar).

Wenn Sie dann Unterschiede von einer Datei zur anderen selektiv zusammenführen möchten, können Sie die folgenden Befehle verwenden:

(Betrachten Sie die "aktuelle Datei" als die, in der sich der Cursor befindet.)

^ W ^ W , um den Fokus vom Fenster einer Datei zum Fenster der anderen Datei zu ändern

] c , um mit Unterschieden zum nächsten Block zu gelangen

[c , um die Suche nach dem vorherigen Block mit Unterschieden umzukehren

do ( d iff o btain), um Änderungen von der anderen Datei in die aktuelle Datei zu übernehmen

dp ( d iff p ut), um Änderungen von der aktuellen Datei an die andere Datei zu senden

Hinweis: Sowohl do als auch dp funktionieren, wenn Sie sich in einem Block oder nur in einer Zeile unter einem Block befinden.

u zu u ndo

zo zum Aufklappen / Ausblenden von Text

zc zum erneuten Falten / Ausblenden von Text

zr wird beide Dateien vollständig entfalten (benutze : help fold für mehr Informationen zum Falten)

: diffupdate überprüft die Dateien erneut auf Änderungen

Wenn Sie geänderten Text verschieben oder Änderungen vornehmen, werden auch die jetzt identischen Teile der Dateien automatisch gefaltet.

Wenn Sie fertig sind, können Sie beide Dateien mit folgendem Befehl beenden und schreiben : xa!

Sie können Änderungen auch einzeln schreiben, beenden, verwerfen usw., so wie Sie es normalerweise mit vim tun würden.

Sie können alle gängigen vim-Befehle verwenden, um die Dateien nach Belieben zu bearbeiten. Ich habe nur die gebräuchlichsten und nützlichsten Befehle beschrieben, die Sie wahrscheinlich in einer vimdiff-Sitzung verwenden (im Gegensatz zu einem generischen vim-Befehl).

rgmarcha
quelle
6

Beyond Compare ist das ultimative Werkzeug dafür!

Link: http://www.scootersoftware.com/

Verfügbar für Windows und Linux.

Jeff hat vor einiger Zeit einen guten Übersichtsartikel über das Tool geschrieben:
http://www.codinghorror.com/blog/archives/000454.html

Mark Norgren
quelle
Beyond Compare ist großartig!
Clinton Blackmore
Ist dies auf * nix-Systemen verfügbar?
Preet Sangha
Beyond Compare 3 kann unter Linux nicht als Konsolenanwendung ausgeführt werden. Es erfordert X-Windows. Unterstützte Linux-Distributionen (32-Bit) Red Hat Enterprise Linux 4, 5 Fedora 4-10 Novell Suse Linux Enterprise Desktop 10 openSUSE 10.3, 11 Ubuntu 6.06 - 8.10 Nicht getestet Kein 64-Bit-Linux-Kernel Nicht kompatibel Red Hat Enterprise Linux 3
Mark Norgren
Ohne dieses Tool könnte ich nicht mehr leben! Eine extreme Zeitersparnis. Als ich vor ungefähr einem Jahr von einem PC auf einen Mac umgestiegen bin, war ich sehr froh festzustellen, dass es gerade auch auf einen Mac portiert wurde.
Jpsy
5

Wenn Sie den Einzeiler von nima erweitern, können Sie dies als Shell-Funktion ausführen und in Ihrem .bashrc ablegen

diff <(grep -v '^#' f1) <(grep -v '^#' f2)

wird (mit -u, weil ich Unified Diffs mag)

function cleandiff {
  diff -u <(grep -v '^#' $1| grep -v '^ *$') <(grep -v '^#' $2 | grep -v '^ *$')
}

Wenn Sie GUI Diff Viewer mögen, ist meld nett und versteht revisionskontrollierte Verzeichnisse / Dateien.

Rob Chanter
quelle
+1 für die Meldung, was die grafische Darstellung sooo viel einfacher gemacht hat.
Avery Payne
4

Nachdem ich die Kommentare bereinigt habe, würde ich KDiff3 empfehlen, es ist ein ziemlich gutes Diff / Merge-Tool und du brauchst kein vim fu, um es zu benutzen :)


quelle
3

Es gibt vielleicht eine elegantere Methode, aber pragmatisch (und schnell):

grep -v '^#' server1-snmpd.conf | grep -v '^ *$' > server1-snmpd.conf-clean
grep -v '^#' server2-snmpd.conf | grep -v '^ *$' > server2-snmpd.conf-clean
diff server1-snmpd.conf-clean server2-snmpd.conf-clean
jj33
quelle
2

Wenn Sie eine bash-ähnliche Shell verwenden, können Sie Folgendes versuchen:

# Name this diff-stripped
STRIPPED=
for i in $*; do
    egrep -v "^#|^\s*" "$i" > "$i.stripped"
    STRIPPED="$STRIPPED $i.stripped"
done

diff $STRIPPED

Rufen Sie es dann folgendermaßen auf:

 diff-stripped file1 file2 ...

Sie können auch ändern, diffum vimdiffoder gvimdiffdie beide mit kommen vim.

Neil
quelle
2

Durch die Erweiterung der Xerxes-Lösung können Sie komplexere Tools verwenden, als diffdie Unterschiede anzuzeigen.

wdiff

wdiffkann manchmal "zu schlau" sein, aber ich finde es oft nützlich, um einen kurzen Blick auf die Unterschiede zwischen Konfigurationsdateien zu werfen. Dieses Skript kann für die Ausgabe mit Farben verwendet werden:

#!/bin/bash

RED=$'\e'"[1;31m"
GREEN=$'\e'"[1;32m"
RESET=$'\e'"[0m"
WDIFF_ARGS="-w$RED -x$RESET -y$GREEN -z$RESET --avoid-wraps"

wdiff $WDIFF_ARGS \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
  <(grep -vE '^([ \t]*#|^[ \t]*$)' $2) \
  | less -R

Auf Ubuntu und anderen Debian-basierten Systemen, kurz apt-get install wdiffbevor Sie dieses Skript verwenden.

Meld

Meld ist eine nette GUI-Alternative, aber die "Textfilter" -Funktion hat einige Probleme. Anstatt die Textfilterung zu verwenden, entferne ich Kommentare vollständig, bevor die Ergebnisse in Meld angezeigt werden. Der Nachteil ist, dass die Dateien beim Vergleichen nicht mehr bearbeitet werden können. Hier ist ein einfaches Skript für die Verwendung von Meld:

#!/bin/bash

meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
     <(grep -vE '^([ \t]*#|^[ \t]*$)' $2)
Akaihola
quelle
2

Manchmal können mehrere zusätzliche gemeinsame Zeilen entfernt werden, indem Dateien vor dem Diff sortiert werden. Daher füge ich dem bereits Geschriebenen Folgendes hinzu:

 diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort)

Dies ist natürlich sinnvoll für Dateien, bei denen sich die Reihenfolge der Zeilen nicht auf den Inhalt auswirkt (seien Sie sich also bewusst).

Oriettaxx
quelle
1

Dies ist das gleiche wie bei Nima, filtert jedoch auch Leerzeilen heraus, wenn jemand dies wünscht.

diff -u <(egrep -v '^(#| *$)' f1) <(egrep -v '^(#| *$)' f2)

(Ich würde auch Colordiff installieren, wenn möglich, und das anstelle von normalem Diff verwenden)

Kennzeichen
quelle
1

Ich verwende WinMerge http://winmerge.org, um Dateien zu unterscheiden, vorausgesetzt, ich muss sie auf meinen Computer herunterladen, aber es funktioniert für.

steve.lippert
quelle