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?
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?
Risposte:
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.
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).
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
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.
Dopo aver pulito i commenti, consiglierei di usare KDiff3, è un ottimo strumento diff / merge e non hai bisogno di VIM FU per usarlo :)
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
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 diff
a vimdiff
o gvimdiff
entrambi vim
.
Estendendo la soluzione di Serse, è possibile utilizzare strumenti più sofisticati rispetto diff
alla visualizzazione delle differenze.
wdiff
può 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 wdiff
prima di usare questo script.
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)
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).
Uso WinMerge http://winmerge.org per i file diff, purché sia necessario rimuoverli sulla mia macchina, ma funziona.
level
! =)