¿Cómo puedo diferenciar dos archivos de configuración?

15

Tengo dos archivos snmpd.conf, uno en un servidor que funciona y otro que no. ¿Cómo puedo diferenciar los dos archivos de configuración mientras elimino los comentarios irrelevantes y las nuevas líneas?

jldugger
fuente
1
¡Cuidado con jldugger! Estás a punto de hacerlo level! =)
Jerjes
Realmente es una mala idea quitar comentarios, ¿cómo sabes que son irrelevantes sin mirarlos?
AnonymousLurker

Respuestas:

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

Para evitar líneas en blanco y líneas que no contienen más que espacios, además de líneas idénticas que tienen una única diferencia de espacios iniciales agregados ...

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

Sin embargo, en este punto, probablemente lo pondría en un guión y escribiría algo como la sugerencia original que es un poco más legible.

Jerjes
fuente
+1 por proporcionar una solución de línea única
wzzrd
¿Alguna idea sobre cómo omitir líneas que contienen espacios en blanco también? Resulta que una vez que cortas los comentarios hay muchas líneas en blanco que los separan.
jldugger
@jldugger, intente actualizar el grep para que sea así para excluir comentarios y espacios en blanco. - egrep -v '^ (#. * |) $'
Zoredache
19

Si se siente cómodo con vim , le recomiendo que use vimdiff :

vimdiff file1 file2

Esto abrirá una sesión vim con dos paneles, con un archivo en cada lado. Las luces y el color indicarán diferencias entre los archivos, y todas las partes idénticas estarán ocultas (plegadas, pero expandibles).

Luego, si desea fusionar selectivamente las diferencias de un archivo a otro, puede usar los siguientes comandos:

(Considere que el "archivo actual" es el que está donde está el cursor)

^ W ^ W para cambiar el foco de la ventana de un archivo a la ventana del otro archivo

] c para avanzar al siguiente bloque con diferencias

[c para invertir la búsqueda del bloque anterior con diferencias

hacer ( d iff o btain) para traer cambios del otro archivo al archivo actual

dp ( d iff p ut) para enviar cambios desde el archivo actual al otro archivo

Nota: Ambos do como dp funcionan si está en un bloque o solo una línea debajo de un bloque.

U a U NDO

zo para desplegar / ocultar texto

zc para volver a doblar / volver a ocultar el texto

zr desplegará ambos archivos completamente (use : help fold para obtener más información sobre el plegado)

: diffupdate volverá a escanear los archivos en busca de cambios

A medida que comienza a mover el texto modificado o a introducir cambios, las partes ahora idénticas de los archivos también se plegarán automáticamente.

Cuando haya terminado, puede salir y escribir ambos archivos con : xa!

También puede escribir, salir, descartar cambios, etc., un panel a la vez, como lo haría normalmente con vim.

Puede usar todos los comandos vim comunes para editar los archivos a voluntad; Solo describí los comandos más comunes y útiles que probablemente usará en una sesión de vimdiff (en lugar de una vim genérica).

rgmarcha
fuente
6

¡Beyond Compare es la herramienta definitiva para esto!

Enlace: http://www.scootersoftware.com/

Disponible para Windows y Linux.

Jeff escribió un buen artículo general sobre la herramienta hace un tiempo:
http://www.codinghorror.com/blog/archives/000454.html

Mark Norgren
fuente
¡Beyond Compare es increíble!
Clinton Blackmore
¿Está disponible en los sistemas * nix?
Saluda a Sangha
Beyond Compare 3 no se ejecuta como una aplicación de consola en Linux. Requiere X-Windows. Distribuciones de Linux admitidas (32 bits) Red Hat Enterprise Linux 4, 5 Fedora 4 - 10 Novell Suse Linux Enterprise Desktop 10 openSUSE 10.3, 11 Ubuntu 6.06 - 8.10 No probado Cualquier kernel de Linux de 64 bits No compatible Red Hat Enterprise Linux 3
Mark Norgren
¡Ya no podría vivir sin esta herramienta! Un ahorro de tiempo extremo. Cuando cambié de PC a Mac hace aproximadamente 1 año, estaba muy feliz de descubrir que también acababa de ser transferido a Mac.
Jpsy
5

Ampliando el one-liner de nima, podría hacerlo como una función de shell y soltarlo en su .bashrc

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

se convierte (usando -u porque me gustan las diferencias unificadas)

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

Si le gustan los visores de diferencias de GUI, la fusión es agradable y comprende directorios / archivos controlados por revisión.

Rob Chanter
fuente
+1 para meld, lo que ha hecho que la diferenciación gráfica sea mucho más fácil.
Avery Payne
4

Después de limpiar los comentarios, recomendaría usar KDiff3, es una herramienta de combinación / fusión bastante buena y no necesita vim fu para usarla :)


fuente
3

Puede haber una forma más elegante de hacerlo, pero de manera pragmática (y rápida):

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
fuente
2

Si está utilizando un shell tipo bash, puede intentar esto:

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

diff $STRIPPED

Luego invocarlo así:

 diff-stripped file1 file2 ...

También puede cambiar diffa vimdiffo con los gvimdiffque vienen ambos vim.

Neil
fuente
2

Al extender la solución de Xerxes, puede usar herramientas más sofisticadas que diffpara mostrar las diferencias.

wdiff

wdiffa veces puede ser "demasiado inteligente", pero a menudo me resulta útil para echar un vistazo rápido a las diferencias entre los archivos de configuración. Este script se puede usar para la salida con colores:

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

En Ubuntu y otros sistemas basados ​​en Debian, solo apt-get install wdiff antes de usar este script.

Fusión

Meld es una buena alternativa de GUI, pero su función "Filtrado de texto" tiene algunos problemas. En lugar de utilizar el filtrado de texto, elimino los comentarios por completo antes de mostrar los resultados en Meld. El inconveniente es perder la capacidad de editar los archivos al compararlos. Aquí hay un script simple para usar Meld:

#!/bin/bash

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

A veces, se pueden eliminar varias líneas comunes adicionales clasificando los archivos antes de la diferencia, por lo que agregaría a lo que ya está escrito lo siguiente:

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

esto, por supuesto, tiene sentido para los archivos donde el orden de las líneas no afecta su contenido (así que tenga en cuenta).

Oriettaxx
fuente
1

Esto es lo mismo que el trazador de líneas de nima, pero también filtrará las líneas en blanco como alguien solicitó.

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

(También instalaría colordiff si es posible y lo usaría en lugar de la diferencia normal)

marca
fuente
1

Uso WinMerge http://winmerge.org para diferenciar archivos, dado que tengo que bajarlos a mi máquina, pero funciona.

steve.lippert
fuente