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?
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?
Antworten:
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.
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).
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
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.
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 :)
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, diff
um vimdiff
oder gvimdiff
die beide mit kommen vim
.
Durch die Erweiterung der Xerxes-Lösung können Sie komplexere Tools verwenden, als diff
die Unterschiede anzuzeigen.
wdiff
kann 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 wdiff
bevor Sie dieses Skript verwenden.
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)
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).
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)
Ich verwende WinMerge http://winmerge.org, um Dateien zu unterscheiden, vorausgesetzt, ich muss sie auf meinen Computer herunterladen, aber es funktioniert für.
level
! =)