Jak mogę różnicować dwa pliki konfiguracyjne?

15

Mam dwa pliki snmpd.conf, jeden na serwerze, który działa, a drugi nie. Jak mogę różnicować dwa pliki konfiguracyjne, usuwając nieistotne komentarze i nowe linie?

jldugger
źródło
1
Uważaj jldugger! Zaraz to zrobisz level! =)
Kserkses
Naprawdę złym pomysłem jest usuwanie komentarzy, skąd wiesz, że nie mają one znaczenia bez patrzenia na nie?
AnonymousLurker,

Odpowiedzi:

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

Aby uniknąć pustych linii i linii zawierających wyłącznie spacje, oprócz identycznych linii, które mają jedną różnicę dodanych spacji wiodących ...

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

W tym momencie jednak prawdopodobnie umieściłbym to w skrypcie i napisałem coś w rodzaju oryginalnej sugestii, która jest nieco bardziej czytelna.

Kserkses
źródło
+1 za dostarczenie rozwiązania
jednowierszowego
Jakieś pomysły na to, jak również pominąć wiersze zawierające białe znaki? Okazuje się, że po wycięciu komentarzy rozstawionych jest wiele pustych linii.
jldugger
@ jldugger, spróbuj zaktualizować grep, aby był taki, aby wykluczyć komentarze i białe znaki. - egrep -v '^ (#. * |) $'
Zoredache
19

Jeśli czujesz się komfortowo z vimem , zdecydowanie zachęcam do korzystania z vimdiff :

vimdiff file1 file2

Spowoduje to otwarcie sesji vim z dwoma oknami, z jednym plikiem po każdej stronie. Podświetlenia i kolory wskażą różnice między plikami, a wszystkie identyczne części zostaną ukryte (złożone, ale rozwijane).

Następnie, jeśli chcesz selektywnie łączyć różnice między dwoma plikami, możesz użyć następujących poleceń:

(Rozważ „bieżący plik” jako ten, w którym znajduje się kursor)

^ W ^ W, aby zmienić fokus z okna jednego pliku na okno drugiego pliku

] c, aby przejść do następnego bloku z różnicami

[c, aby cofnąć wyszukiwanie poprzedniego bloku z różnicami

do ( d iff o btain), aby wprowadzić zmiany z innego pliku do bieżącego pliku

dp ( d iff p ut), aby wysłać zmiany z bieżącego pliku do innego pliku

Uwaga: Zarówno do, jak i dp działają, jeśli jesteś na bloku lub tylko jednym wierszu pod blokiem.

U z u ndo

zo, aby rozwinąć / ukryć tekst

zc, aby ponownie złożyć / ukryć tekst

zr całkowicie rozłoży oba pliki (użyj : help fold, aby uzyskać więcej informacji na temat składania)

: diffupdate ponownie przeskanuje pliki w poszukiwaniu zmian

Gdy zaczniesz przenosić zmieniony tekst lub wprowadzać zmiany, identyczne teraz części plików również się automatycznie zwiną.

Po zakończeniu możesz zamknąć i zapisać oba pliki za pomocą : xa!

Możesz także pisać, wychodzić, odrzucać zmiany itp., Jeden panel naraz, tak jak normalnie robisz z vimem.

Możesz użyć wszystkich typowych poleceń vima, aby dowolnie edytować pliki; Opisałem tylko najbardziej popularne i przydatne polecenia, których prawdopodobnie użyjesz w sesji vimdiff (w przeciwieństwie do ogólnej wersji vim).

rgmarcha
źródło
6

Beyond Compare to najlepsze narzędzie do tego!

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

Dostępne dla systemu Windows i Linux.

Jeff napisał jakiś dobry artykuł poglądowy na temat narzędzia jakiś czas temu:
http://www.codinghorror.com/blog/archives/000454.html

Mark Norgren
źródło
Beyond Compare jest niesamowity!
Clinton Blackmore
czy jest to dostępne w systemach * nix?
Preet Sangha
Beyond Compare 3 nie działa jako aplikacja konsoli w systemie Linux. Wymaga X-Windows. Obsługiwane dystrybucje systemu Linux (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 Nie testowano Dowolne 64-bitowe jądro Linuksa Nie jest kompatybilne Red Hat Enterprise Linux 3
Znak Norgren
Nie mogłem już żyć bez tego narzędzia! Ekstremalna oszczędność czasu. Kiedy przeszedłem z komputera na komputer Mac około rok temu, bardzo cieszyłem się, że został on również przeniesiony na komputer Mac.
Jpsy
5

Rozszerzając na jednowarstwową nimę, możesz to zrobić jako funkcję powłoki i upuścić ją w swoim .bashrc

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

staje się (używając -u, ponieważ lubię zunifikowane różnice)

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

Jeśli podoba Ci się GUI diff viewers, meld jest fajny i rozumie pliki / pliki kontrolowane przez wersję.

Rob Chanter
źródło
+1 dla meldu, który znacznie ułatwił graficzne różnicowanie.
Avery Payne
4

Po wyczyszczeniu komentarzy radzę używać KDiff3, jest to całkiem dobre narzędzie do porównywania / scalania i nie potrzebujesz vim fu, aby go używać :)


źródło
3

Może to być bardziej elegancki sposób, ale pragmatycznie (i szybko):

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
źródło
2

Jeśli używasz powłoki podobnej do bash, możesz spróbować:

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

diff $STRIPPED

Następnie wywołaj to w ten sposób:

 diff-stripped file1 file2 ...

Możesz także zmienić diffna vimdifflub z gvimdiffktórych oba pochodzą vim.

Neil
źródło
2

Rozszerzając rozwiązanie Xerxesa, możesz użyć bardziej wyrafinowanych narzędzi niż diffdo wyświetlania różnic.

wdiff

wdiffczasami bywa „zbyt mądry”, ale często przydaje mi się szybki rzut oka na różnice między plikami konfiguracyjnymi. Ten skrypt może być używany do wyświetlania w kolorach:

#!/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

W Ubuntu i innych systemach opartych na Debianie, tuż apt-get install wdiffprzed użyciem tego skryptu.

Meld

Meld jest przyjemną alternatywą dla GUI, ale jego funkcja „Filtrowania tekstu” ma pewne problemy. Zamiast korzystać z filtrowania tekstu, usuwam komentarze całkowicie przed wyświetleniem wyników w Meld. Wadą jest utrata możliwości edycji plików podczas ich porównywania. Oto prosty skrypt do korzystania z Meld:

#!/bin/bash

meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
     <(grep -vE '^([ \t]*#|^[ \t]*$)' $2)
akaihola
źródło
2

Czasami można usunąć kilka dodatkowych wspólnych wierszy, sortując pliki przed różnicą, więc dodałbym do tego, co już napisano:

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

ma to oczywiście sens w przypadku plików, w których kolejność linii nie wpływa na jej zawartość (więc należy pamiętać).

Oriettaxx
źródło
1

Jest to to samo, co jedna linijka nimi, ale odfiltruje również puste linie, jak ktoś poprosił.

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

(Jeśli to możliwe, zainstalowałbym colordiff i użyłbym tego zamiast zwykłego diff)

znak
źródło
1

Używam WinMerge http://winmerge.org do różnicowania plików, oczywiście muszę ściągać je na moją maszynę, ale to działa.

steve.lippert
źródło