Come posso diff due file di configurazione?


15

Ho due file snmpd.conf, uno su un server che funziona e uno che no. Come faccio a diffondere i due file di configurazione mentre rimuovo i commenti irrilevanti e le nuove righe?


1
Attenzione jldugger! Stai per farlo level! =)
Serse

È davvero una cattiva idea eliminare i commenti, come fai a sapere che sono irrilevanti senza guardarli?
AnonymousLurker,

Risposte:


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

Per evitare linee vuote e linee contenenti nient'altro che spazi, oltre a linee identiche che hanno una sola differenza di spazi iniziali aggiunti ...

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

A questo punto, probabilmente, l'avrei inserito in una sceneggiatura e avrei scritto qualcosa come il suggerimento originale che è un po 'più leggibile.


+1 per fornire una soluzione a linea singola
wzzrd

Qualche idea su come omettere anche le righe contenenti spazi bianchi? Viene fuori una volta che hai tagliato i commenti ci sono molte linee vuote che li spaziano.
jldugger,

@jldugger, prova ad aggiornare grep in questo modo per escludere commenti e spazi bianchi. - egrep -v '^ (#. * |) $'
Zoredache,

19

Se ti senti a tuo agio con Vim , ti consiglio vivamente di usare Vimdiff :

vimdiff file1 file2

Questo aprirà una sessione vim con due riquadri, con un file su ciascun lato. Le luci e il colore indicheranno le differenze tra i file e tutte le parti identiche saranno nascoste (piegate, ma espandibili).

Quindi, se desideri unire selettivamente le differenze da un file all'altro, puoi utilizzare i seguenti comandi:

(Considera il "file corrente" come quello in cui si trova il cursore)

^ W ^ W per cambiare lo stato attivo dalla finestra di un file a quella dell'altro file

] c per avanzare al blocco successivo con differenze

[c per invertire la ricerca del blocco precedente con differenze

do ( d iff o btain) per apportare modifiche dall'altro file al file corrente

dp ( d iff p ut) per inviare le modifiche dal file corrente all'altro file

Nota: Sia do che dp funzionano se ci si trova su un blocco o solo una riga sotto un blocco.

u per u ndo

zo per aprire / nascondere il testo

zc per ripiegare / nascondere nuovamente il testo

zr aprirà completamente entrambi i file (usare : help fold per maggiori informazioni sulla piegatura)

: diffupdate eseguirà nuovamente la scansione dei file alla ricerca di modifiche

Quando inizi a spostare il testo modificato o apportare modifiche, anche le parti dei file ora identiche si piegheranno automaticamente.

Al termine, è possibile chiudere e scrivere entrambi i file con : xa!

Puoi anche scrivere, uscire, annullare le modifiche, ecc., Un riquadro alla volta, come faresti normalmente con Vim.

Puoi usare tutti i comandi comuni di vim per modificare i file a piacimento; Ho descritto solo i comandi più comuni e utili che potresti usare in una sessione di vimdiff (al contrario di una vim generica).


6

Beyond Compare è lo strumento perfetto per questo!

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

Disponibile per Windows e Linux.

Jeff ha scritto un buon articolo di panoramica sullo strumento qualche tempo fa:
http://www.codinghorror.com/blog/archives/000454.html


Beyond Compare è fantastico!
Clinton Blackmore,

è disponibile su sistemi * nix?
Preet Sangha,

Beyond Compare 3 non funziona come un'applicazione console su Linux. Richiede X-Windows. Distribuzioni Linux supportate (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 Non testato Qualsiasi kernel Linux a 64 bit Non compatibile Red Hat Enterprise Linux 3
Mark Norgren,

Non potrei più vivere senza questo strumento! Un risparmio di tempo estremo. Quando sono passato da PC a Mac circa 1 anno fa, sono stato molto felice di scoprire che era stato appena portato su Mac.
Jpsy,

5

Espandendo sul one-liner di nima, potresti farlo come una funzione shell e rilasciarlo nel tuo .bashrc

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

diventa (usando -u perché mi piacciono le differenze unificate)

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

Se ti piacciono i visualizzatori diff della GUI, la fusione è piacevole e comprende dir / file controllati da revisione.


+1 per la fusione, che ha reso la diffusione grafica molto più semplice.
Avery Payne,

4

Dopo aver pulito i commenti, consiglierei di usare KDiff3, è un ottimo strumento diff / merge e non hai bisogno di VIM FU per usarlo :)


3

Potrebbe esserci un modo più elegante per farlo, ma pragmaticamente (e rapidamente):

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

Se stai usando una shell simile a bash, puoi provare questo:

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

diff $STRIPPED

Quindi invocalo in questo modo:

 diff-stripped file1 file2 ...

È inoltre possibile passare diffa vimdiffo gvimdiffentrambi vim.


2

Estendendo la soluzione di Serse, è possibile utilizzare strumenti più sofisticati rispetto diffalla visualizzazione delle differenze.

wdiff

wdiffpuò essere "troppo intelligente" a volte, ma lo trovo spesso utile per dare una rapida occhiata alle differenze tra i file di configurazione. Questo script può essere utilizzato per l'output con i colori:

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

Su Ubuntu e altri sistemi basati su Debian, poco apt-get install wdiffprima di usare questo script.

meld

Meld è una valida alternativa alla GUI, ma la sua funzione "Filtro testo" presenta alcuni problemi. Invece di utilizzare il filtro di testo, rimuovo del tutto i commenti prima di mostrare i risultati in Combinazione. Lo svantaggio sta perdendo la possibilità di modificare i file confrontandoli. Ecco un semplice script per l'utilizzo di Meld:

#!/bin/bash

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

2

A volte, è possibile eliminare diverse righe comuni ordinando i file prima del diff, quindi aggiungerei a quanto già scritto quanto segue:

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

questo ovviamente ha senso per i file in cui l'ordine delle linee non influenza il suo contenuto (quindi attenzione).


1

Questo è lo stesso della fodera di Nima, ma filtrerà anche le righe vuote come qualcuno ha richiesto.

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

(Se possibile installerei anche Colordiff e lo userei al posto del normale diff)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.