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?
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?
Respuestas:
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.
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).
¡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
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.
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 :)
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
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 diff
a vimdiff
o con los gvimdiff
que vienen ambos vim
.
Al extender la solución de Xerxes, puede usar herramientas más sofisticadas que diff
para mostrar las diferencias.
wdiff
a 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.
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)
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).
Uso WinMerge http://winmerge.org para diferenciar archivos, dado que tengo que bajarlos a mi máquina, pero funciona.
level
! =)