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?


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.


+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).


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


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ę.


+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ć :)


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

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.


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)

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ć).


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)


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.