Utilizando Diff Command para comparar dos archivos en el terminal Linux

¿Cómo estais? aquí Luis. Os traigo un nuevo post sobre el sistema operativo mas molón. Encantado linuxeros.

Cuando necesite comparar dos ficheros que contengan texto similar a Linux, utilice el archivo orden diff puede facilitar su tarea. El orden compara dos ficheros para sugerir cambios que harán que los archivos sean idénticos. Excelente para encontrar aquella clave extra rizada que rompió el código recientemente actualizado.

Utilizar el comando diff es muy sencillo. Aquí tiene la sintaxis:

diff [options] file1 file2

Pero entender su producción es algo diferente. No se preocupe, le contaré la salida para que pueda comparar dos archivos y entender la diferencia entre ellos.

Comprensión del orden diff Linux

Para empezar, necesita un par de archivos. He generado una lista mediante un generador de palabras aleatorias.

He añadido la lista dos archivos diferentes y luego he modificado la lista mediante:

  • Cambiar el orden de la lista
  • Añadir cartas
  • Cambio de caso

He guardado estos archivos similares como 1.txt y 2.txt. Aquí tiene el aspecto que tiene antes de hacer nada.

Os sugiero que siga el tutorial y leer, por lo que cree archivos nuevos y añadir el siguiente.

Contenido de 1.txt:

telaraña
medallón
acústica
expansión
registro

Contenido de 2.txt:

telaraña
MEDIQUETA
acústica
registros
expansión

Ejemplo 1: diferencia sin opciones

A ver qué pasa cuando ejecute el diff sin ninguna opción.

christopher:~$ diff 1.txt 2.txt
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

Confundido? No estás solo. La producción no es exactamente compatible con los humanos. Para entender qué pasa, debe saber más sobre cómo funciona diff.

Puede ser útil saber que cuando se realiza el análisis, fichero2 [in the syntax] se trata como el documento de referencia con el que intente hacer coincidir. Por tanto, puede decirse que diff funciona de esta manera:

diff <file_to_edit> <file_as_reference>

Esto también significa que en una salida diferente en función del orden en que coloque los nombres de los archivos.

El orden es importante

Un ejemplo de cómo la salida difiere según el orden del archivo:

christopher:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

christopher:~$ diff 2.txt 1.txt 
2c2
< LOCKET
---
> locket
4d3
< records
5a5
> record

Símbolos importantes en la salida del comando diff

Utilizando la tabla siguiente como referencia, puede entender mejor lo que pasa en su terminal.

símbolo significado
A Agregar
C cambio
D Eliminar
# Números de línea
– – – Separa los archivos de salida
< archivo 1
> archivo 2

Hacemos otra vistazo a la salida del comando diff:

christopher:~$ diff 1.txt 2.txt 
2c2
< locket
---
> LOCKET
3a4
> records
5d5
< record

Explicación de la salida del comando diff

Veamos la primera diferencia en la salida:

Línea de salida explicación
2c2 La línea 2 del archivo 1, CAMBIO con la línea 2 del archivo 2.
Locker Cambie «Locket» a «Locket» para que coincida con el archivo 2.txt

Veamos la siguiente parte de la salida:

Línea de salida explicación
3A4 Tras la línea 3 del archivo 1, añada la línea 4 del archivo 2.
> registros Es decir, añadir «registros» para crear la 4ª línea en el archivo 1. De modo que el fichero 1.txt coincidirá con el archivo 2.txt

Del mismo modo:

Línea de salida explicación
5d5 Suprimir el texto «grabar» de la quinta línea del archivo 1. De modo que este archivo 1.txt coincidirá con el archivo 2.txt

Ninguna función de corrección ortográfica ni de diccionario integrada a la orden. No reconoce los «registros» y los «registros» como relacionados. Su único objetivo es hacer coincidir perfectamente los dos archivos.

Mirando el resultado, aunque es bastante difícil de traducir. Es poco probable que ahorra mucho tiempo.

Afortunadamente, hay opciones que se pueden añadir para que las cosas sean más legibles por humanos. Veamos un par de ejemplos diferentes con la misma lista.

Ejemplo 2: difiere en contexto «Copiado» con -c

La opción de contexto proporciona una representación más visual sobre la información más programática que se muestra por defecto. Continuamos con nuestro ejemplo de texto.

Símbolos más importantes en la salida del comando diff

símbolo significado
+ Agregar
! cambio
Eliminar
*** archivo 1
– – – archivo 2

christopher:~$ diff -c 1.txt 2.txt 
*** 1.txt    2019-10-20 12:05:09.244673327 -0400
--- 2.txt    2019-10-20 12:11More:31.382547316 -0400
***************
*** 1,5 ****
  cobweb
! locket
  acoustics
  expansion
- record
--- 1,5 ----
  cobweb
! LOCKET
  acoustics
+ records
  expansion

Es mucho más fácil de entender cuando vea la información de esta manera. En lugar de la salida alfanumérica, el nuevo conjunto de símbolos le ayuda a identificar rápidamente las diferencias entre los dos archivos.

La salida muestra primero el primer fichero, es decir, 1.txt y su línea de 1 a 5. Se dice que hay un ligero cambio en (parte de) la línea 2 del archivo 1.txt y (parte de) la línea 2 del archivo 2 .txt.

También indica que la línea número 5 del archivo 1 se ha suprimido (-) en el segundo archivo.

– 1,5 – indica el inicio del segundo archivo y dice que la línea 2 ha cambiado ligeramente de la línea 2 del archivo 1. También indica que la línea 4 se ha añadido (+) en el segundo archivo y no hay hacia correspondiente línea en el archivo 1.

Ejemplo 3: difiere en contexto «Unificado» con -u

Esta opción proporciona una salida similar al formato de contexto copiado. En lugar de mostrar los dos archivos por separado, los fusiona.

christopher:~$ diff 1.txt 2.txt -u
--- 1.txt    2019-10-20 12:05:09.244673327 -0400
+++ 2.txt    2019-10-20 12:11:31.382547316 -0400
@@ -1,5 +1,5 @@
 cobweb
-locket
+LOCKET
 acoustics
+records
 expansion
-record

Como puede ver, utiliza los mismos símbolos que antes, pero en lugar del símbolo de cambio, sugiere que se realicen cambios mediante una lectura fácil. + o bien - símbolos. Aquí, se recomienda eliminar la línea 2 de 1.txt y sustitúyalo por la línea 2 de 2.txt.

En el futuro, también os sugiere añadir registros después de la línea que contiene acústica y borra la línea registro después de la línea que contiene la expansión.

Todos estos cambios se sugieren para el primer archivo del orden diff. Este es otro escenario donde ayuda a recordar que el programa diff utiliza el segundo archivo que aparece como «original» o base para las correcciones.

Para comparar una lista como ésta, personalmente encuentro este método más fácil de usar. Os proporciona una visualización clara del texto que hay que cambiar para que los archivos sean idénticos.

Ejemplo 4: compare pero ignorar los casos con -y

Las búsquedas que distinguen entre mayúsculas y minúsculas son las predeterminadas para la diferencia, pero puede desactivarla. Veamos qué pasa cuando lo haga.

christopher:~$ diff 1.txt 2.txt -i
3a4
> records
5d5
< record

Como puede ver, «Locket» y «Locket» ya no aparecen como cambios sugeridos.

Ejemplo 5: Difiere con -color

Puedes utilizar --color para resaltar los cambios a la salida del comando diff. Cuando se ejecuta la orden, las secciones de salida se imprimirán en diferentes colores de la paleta de terminales.

Salida del orden Diff con color
Salida del orden Diff con color

Ejemplo 6: Análisis rápida de archivos con opciones de pedido diff -si -q

Hay un par de maneras sencillas de comprobar si los archivos son idénticos o no. si utiliza -s le indicará que los archivos son idénticos o que funcionará difiriendo de la manera normal.

utilizando -q sólo le dirá que los archivos «difieren». Si no lo hacen, no obtendrá ningún resultado.

christopher:~$ diff 1.txt 1.txt -s
Files 1.txt and 1.txt are identical
christopher:~$ diff 1.txt 2.txt -q
Files 1.txt and 2.txt differ

Consejo extra: utilizar el comando diff Linux con archivos de texto grandes

Es posible que no siempre compare información tan sencilla. Es posible que tenga archivos de texto grandes para escaneado y encontrar diferencias. Detallaré algunos métodos para gestionar este tipo de problemas.

Para este ejemplo, he creado dos ficheros con grandes trozos de texto (lorem ipsum). Cada línea tiene cientos de columnas. Evidentemente, esto dificultó la comparación de líneas.

Cuando diff ejecuta en un fichero como este, la salida genera grandes trozos de texto y los símbolos son difíciles de ver incluso con herramientas como la salida contextual.

Para ahorrar espacio, hice una captura de pantalla de la salida para que la miraran.

Orden Diff con archivos de texto grandes
Orden Diff con archivos de texto grandes

No es muy útil, ¿verdad?

Puede utilizar algunos de los mismos conceptos para analizar este tipo de ficheros. No funcionarán bien a menos que el archivo tenga el formato adecuado. Algunos grandes bloques de texto no tienen saltos de línea. Probablemente se ha encontrado con un archivo como este en el que había que habilitar «Word Wrap» para conseguir que todo el texto se muestre dentro del espacio asignado sin utilizar una barra de desplazamiento. El motivo es que algunos formatos de texto no crean saltos de línea automáticamente. Así acabaréis con grandes trozos de texto en sólo 2-3 líneas. Hay una solución bastante fácil para ello.

Utilice el pliego para envolver texto en líneas

Este es el manual de Linux, por lo que, naturalmente, tenemos una solución para usted y podemos incluir un mini tutorial. Aquí hay una buena redacción sobre fold (Unix) y FMT (GNU). Daré un ejemplo rápido que debería ser bastante explicativo para adelantarnos.

El orden fold se utiliza para romper líneas mediante el número de columnas. Se puede personalizar para ofrecerle opciones sobre cómo se implementan estos nuevos saltos de línea.

En el ejemplo aquí, separar el archivo en una anchura estandarizada y utilice el archivo -s opción. Esto indica al programa que se rompa SÓLO donde haya espacios en blanco, no en medio del texto.

Utilice el pliego para insertar rápidamente saltos de línea

fold -w 80 -s lorem.txt > lorem.txt
fold -w 80 -s lorem2.txt > lorem2.txt

Con los dos archivos divididos en 31 líneas en lugar de 3, puede compararlos de manera mucho más eficaz. Este es un ejemplo de su resultado con el filtro de contexto unificado.

christopher:~$ diff lorem.txt 2lorem.txt -u
--- lorem.txt    2019-10-27 09:39:07.298691695 -0400
+++ 2lorem.txt    2019-10-27 09:39:08.370704501 -0400
@@ -1,10 +1,10 @@
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in tincidunt 
 sapien. Maecenas sagittis ex risus, in vehicula turpis imperdiet sed. Phasellus 
 placerat posuere maximus. In hac habitasse platea dictumst. Ut vel tristique 
-eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
+eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
 Suspendisse at mauris vitae sapien euismod tincidunt. Sed placerat finibus 
 blandit. Duis ornare ante at ipsum accumsan, nec bibendum nibh tincidunt. 
-Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
+Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
 vitae enim. Nam condimentum, purus nec semper efficitur, nisi quam vehicula 
 sem, eget finibus diam ipsum suscipit velit.

@@ -21,7 +21,7 @@

 Maecenas lacinia cursus tristique. Nulla a hendrerit orci. Donec lobortis nisi 
 sed ante euismod lobortis. Nullam sit amet est nec nunc porttitor sollicitudin 
-a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
+a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at 
 interdum mi metus vel tellus. Fusce nec dui a risus posuere mattis at eu orci. 
 Proin purus sem, finibus eget viverra vel, porta pulvinar ex. In hac habitasse 
 platea dictumst. Nunc faucibus leo nec tristique porta. Phasellus luctus ipsum

Utilice diff con la salida -minimal

Puede hacerlo un poco más fácil de leer con --minimal etiqueta. Esto hace que los archivos de texto más grandes sean un poco más fáciles de leer. Echemos un vistazo a la salida.

christopher:~$ diff lorem.txt 2lorem.txt --minimal
4c4
< eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor porta. 
---
> eros, sit amet sodales nibh. Maecenas non nibh a nisi porttitor PORTA. 
7c7
< Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu,  
---
> Nullam ut rhoncus risus. Phasellus est ex, tristique et semper eu, facilisis 
24c24
< a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim QUAM, at 
---
> a ut orci. Ut euismod, ex at venenatis mattis, neque massa dignissim quam, at 

Puede combinar cualquiera de estos consejos o utilizar algunas de las otras opciones que aparecen en las páginas manuales de dif. Se trata de una utilidad de software potente y fácil de usar.

Espero que este artículo le sea útil. Si tiene un consejo, no olvide dejarnos un comentario y explicarnos esto.

Este Blog lo escribimos para ayudar y servir de ayuda a la gente Linux. Esperamos que os guste.

Leave a Reply