¿Hay un formato diferencial condensado de lado a lado?

40

Tengo dos archivos de registro con miles de líneas. Después del preprocesamiento, solo difieren algunas líneas. Estas líneas restantes son diferencias reales o grupos de líneas mezcladas.

Las diferencias unificadas me permiten ver las diferencias detalladas, pero dificulta la comparación manual con los globos oculares. Las diferencias de lado a lado parecen más útiles para la comparación, pero también agregan miles de líneas sin cambios. ¿Hay alguna manera de aprovechar las ventajas de ambos mundos?

Tenga en cuenta que estos archivos de registro son generados por xscopeun programa que monitorea los datos del protocolo Xorg. Estoy buscando herramientas de uso general que se puedan aplicar a situaciones similares a las anteriores, no herramientas de análisis de registro de acceso a servidores web especializadas, por ejemplo.


Hay dos archivos de registro de ejemplo disponibles en http://lekensteyn.nl/files/qemu-sdl-debug/ ( log13y log14). Se puede encontrar un comando de preprocesador en el xscope-filterarchivo que elimina las marcas de tiempo y otros detalles menores.

Lekensteyn
fuente
2
¿ diffTienes tu --suppress-common-linesopción? pastebin.com/KZrVCNFR
manatwork
1
@manatwork Bien, lo hace. ¿Alguna forma de agregar más contexto (por ejemplo, números de línea)?
Lekensteyn
55
Entonces, tal vez vimdiff(del paquete vim ) satisfaría mejor sus necesidades: pantalla paralela, coloreada, líneas comunes plegadas. Los números de línea se pueden activar con :set number.
manatwork
Creo que deberías poner vimdiff como respuesta :)
Kotte
1
Se prefieren las herramientas CLI, pero las herramientas GUI también se permiten si son lo suficientemente pequeñas. He intentado kdiff3, pero todavía produjo muchos detalles. Idealmente, no veo todos los detalles innecesarios. Adjuntaré dos conjuntos de datos.
Lekensteyn

Respuestas:

37

Las 2 herramientas de diferenciación que uso el más serían MELD y sdiff .

fusionar

Meld es una GUI pero hace un gran trabajo al mostrar diferencias entre archivos. Está más orientado al desarrollo de software con características como la capacidad de mover los cambios de un lado a otro para fusionar los cambios, pero se puede usar como una herramienta de diferenciación directa de lado a lado.

    ss de fusión

    ss de resaltado de código de fusión

sdiff

He usado esta herramienta por años. Generalmente lo ejecuto con los siguientes modificadores:

$ sdiff -bBWs file1 file2
  • -b Ignorar los cambios en la cantidad de espacio en blanco.
  • -W Ignora todos los espacios en blanco.
  • -B Ignora los cambios cuyas líneas están en blanco.
  • -s No envíe líneas comunes.

A menudo, con los archivos de registro, tendrá que hacer que el ancho de las columnas sea más ancho, puede usar -w <num>para hacer que la pantalla sea más ancha.

otras herramientas que uso de vez en cuando

diffc

Diffc es un script de Python que colorea la salida unificada de diferencias.

$ diffc [OPTION] FILE1 FILE2

             ss de diffc

vimdiff

Vimdiff es probablemente tan bueno, si no mejor, que meld y puede ejecutarse desde un terminal. Siempre me olvido de usarlo, lo que, para mí, es un buen indicador de que encuentro que la herramienta es un poco difícil de usar día a día. Pero YMMV.

                                    ss de vimdiff

slm
fuente
1
Una gran característica de Meld, desafortunadamente no visible en su captura de pantalla, es el resaltado de sintaxis de los archivos de código fuente.
manatwork
Sí. Solía ​​usar vimdiff todo el tiempo, desde entonces me mudé a usar meld, me resulta más fácil de usar y es más fácil ver lo que me dice vs vimdiff.
slm
@manatwork: agregó su enlace a la respuesta, ¡gracias por los comentarios!
slm
1
Se ve muy bien para el código fuente, pero no tanto para comparar archivos de registro. A menudo uso colordiffde colordiff.org para el archivo fuente. A mi entender, sdiffes similar a, diff -ysin diferencias en la salida, pero con opciones ligeramente diferentes. +1 por mostrar algunas buenas alternativas a la diferencia simple.
Lekensteyn
Nunca he usado colordiff, tendré que comprobarlo. Tienes razón en el diff -y. La adición de ese cambio a diffparece haber sucedido en algún momento, o nunca me di cuenta. Además, aquí hay un enlace a la página de recursos de herramientas de gnu diff . Cosas buenas para usar este conjunto de herramientas.
slm
20

Actualmente estoy usando diff de lado a lado con grep filtrando las diferentes líneas:

diff -y -W250 log.txt log2.txt | expand | \
    grep -E -C3 '^.{123} [|<>]( |$)' | colordiff | less -rS
  • La opción -W250hace que la salida sea más amplia para que pueda ver más datos.
  • expand es necesario convertir pestañas en espacios
  • -C3 agrega 3 líneas de contexto a la salida grep.
  • ^.{123} coincide con la mitad de los datos antes de los marcadores de diferencias uno al lado del otro.
  • colordiff hace que la salida sea más bonita de seguir
  • less -rSpermite que se interpreten los colores ANSI ( -r) y evita las líneas ajustadas ( -S).

Este es un truco, las alternativas son bienvenidas.

Lekensteyn
fuente
1
Esto es maravilloso.
Pat Myron
Buena idea. Lamentablemente, la grepexpresión regular es demasiado lenta. También difftiene una -topción para expandir pestañas.
Timmmm
12

¿Nadie mencionó icdiff todavía? ¡Es genial! Pic habla por sí mismo: icdiff

Radek Postołowicz
fuente
Esta es una herramienta muy ordenada, también disponible en aur.
Uzumaki D. Ichigo
Sin embargo, es demasiado lento para archivos grandes.
Timmmm
0

El comando linux "sdiff" muestra las diferencias de lado a lado, por defecto incluye todas las líneas, pero puede usar varias opciones para mostrar solo las diferencias:

sdiff -tWBs -w $COLUMNS config.xml config.xml.original

dónde

-t: traduce pestañas a espacios

-W: ignorar las diferencias de espacios en blanco

-B: ignorar líneas en blanco

-s: ignora las líneas que son iguales

-w $ COLUMNS: usa el ancho completo de la pantalla

Las líneas que se muestran se dividirán entre |, <o>; consulte la documentación o simplemente inténtelo.

Moshe Yudkowsky
fuente