Linux: Diferencias entre dos archivos

Sobre sistemas Linux, disponemos de varias alternativas para comparar dos archivos de texto.

En este post veremos algunas de las formas para encontrar las diferencias entre dos archivos.

Para ello, utilizaremos los siguientes ficheros de texto a modo de ejemplo:

[root@LINUX1]# cat f1.txt
http://www.sysadmit.com
http://sysadmit.com
http://WWW.SYSADMIT.COM
HTTP://www.SYSADMIT.com
www.sysadmit.com
SYSADMIT.com

[root@LINUX1]# cat f2.txt
HTTP://www.sysadmit.COM
---http://sysadmit.com---
http://WWW.SYSADMIT.COM
HTTP://www.SYSADMIT.com
---www.sysadmit.com---

Si comparamos ambos ficheros veremos las siguientes diferencias:

1) SOMBREADO CYAN: La primera linea del fichero f1.txt contiene la cadena http://www.sysadmit.com mientras que la primera linea del fichero f2.txt cambian mayúsculas y minúsculas: HTTP://www.sysadmit.COM

2) SOMBREADO AMARILLO: Las lineas 2 y 5, son distintas. En el segundo fichero (f2.txt) se añade "---" al principio y final del texto.

3) SOMBREADO VERDE: La última linea del primer fichero, no aparece en el segundo fichero.

Antes de examinar las distintas herramientas para comparar ficheros, hemos de entender que muchos de los comparadores de archivos son comparadores linea a linea, es por este motivo que igual nos puede interesar ordenar ambos ficheros antes de proceder a la comparación.

Podemos ordenar ficheros de texto utilizando el comando sort.

Veamos las distintas herramientas sobre shell, para ver las diferencias entre ambos ficheros:

1) Comando diff:


Ejemplo1: Vista ejecución:

[root@LINUX1]# diff f1.txt f2.txt
1,2c1,2
< http://www.sysadmit.com
< http://sysadmit.com
---
> HTTP://www.sysadmit.COM
> ---http://sysadmit.com---
5,6c5
< www.sysadmit.com
< SYSADMIT.com
---
> ---www.sysadmit.com---

Ejemplo1: Explicación: 

Aparecen las lineas de los ficheros con números seguidos de una de estas tres letras: a,c,d

* Cada letra significa:

a = Added = Añadido / Agregado.
d = Deleted = Borrado / Eliminado.
c = Changed = Cambiado.

También nos encontramos con los símbolos de mayor que y menor que.

* Cada símbolo significa:

< = Menor que = Diferencia en el primer fichero.
> = Mayor que = Diferencia en el segundo fichero.

Ejemplo2: Vista ejecución:

[root@LINUX1]# diff f1.txt f2.txt -i
2c2
< http://sysadmit.com
---
> ---http://sysadmit.com---
5,6c5
< www.sysadmit.com
< SYSADMIT.com
---
> ---www.sysadmit.com---

Ejemplo2: Explicación: 

Con el parámetro -i, conseguimos que se ignoren los cambios de mayúsculas y minúsculas, por lo tanto, solo se mostrarán el resto de cambios. 

Ejemplo3: Vista ejecución:

[root@LINUX1]# diff f1.txt f2.txt -q
Files f1.txt and f2.txt differ

Ejemplo3: Explicación: 

Con el parámetro -q, conseguimos que no nos muestre las diferencias entre ambos ficheros, tan solo nos dirá si son o no distintos.


2) Comando sdiff:



Con sdiff, podemos ver las diferencias entre ambos ficheros en modo texto pero de forma más visual.

Ejemplo1 y 2: Vista ejecución:

[root@LINUX1]# sdiff f1.txt f2.txt
http://www.sysadmit.com     | HTTP://www.sysadmit.COM
http://sysadmit.com         | ---http://sysadmit.com---
http://WWW.SYSADMIT.COM       http://WWW.SYSADMIT.COM
HTTP://www.SYSADMIT.com       HTTP://www.SYSADMIT.com
www.sysadmit.com            | ---www.sysadmit.com---
SYSADMIT.com                <

[root@LINUX1]# sdiff f1.txt f2.txt -i
http://www.sysadmit.com       HTTP://www.sysadmit.COM
http://sysadmit.com         | ---http://sysadmit.com---
http://WWW.SYSADMIT.COM       http://WWW.SYSADMIT.COM
HTTP://www.SYSADMIT.com       HTTP://www.SYSADMIT.com
www.sysadmit.com            | ---www.sysadmit.com---
SYSADMIT.com                  <

Ejemplo1 y 2: Explicación: 

Igual que con el comando diff, con el parámetro -i, conseguimos que se ignoren los cambios de mayúsculas y minúsculas.

Cada símbolo significa:

| = Pipe = Ambas lineas a comparar difieren.

< = Menor que = Diferencia en el primer fichero.
> = Mayor que = Diferencia en el segundo fichero. 



3) Comando colordiff:

El comando colordiff, nos muestra en colores la ejecución del comando diff:

Linux: Diferencias entre dos archivos con colordiff

Podemos personalizar los colores a utilizar editando el fichero: /etc/colordiffrc


4) Comando comm:

 

Ejemplo1: Vista ejecución:

[root@LINUX1]# comm f1.txt f2.txt
http://www.sysadmit.com
comm: file 1 is not in sorted order
http://sysadmit.com
http://WWW.SYSADMIT.COM
        HTTP://www.sysadmit.COM
comm: file 2 is not in sorted order
        ---http://sysadmit.com---
        http://WWW.SYSADMIT.COM
                HTTP://www.SYSADMIT.com
        ---www.sysadmit.com---
www.sysadmit.com
SYSADMIT.com


Ejemplo1: Explicación:

La salida de ejecución del comando comm se realiza en tres columnas:

- Primera columna: Muestra las lineas únicas en el fichero 1 (f1.txt).

- Segunda columna: Muestra las lineas únicas en el fichero 2 (f2.txt).

- Tercera columna: Muestra las lineas comunes en ambos ficheros (f1.txt y f2.txt).

Entre los parámetros de ejecución del comando comm, podemos encontrar la posibilidad de mostrar o ocultar columnas.


5) Comando vimdiff:


El comando vimdiff nos permite ver en modo texto las diferencias entre dos archivos. 

vimdiff, forma parte de las utilidades incluidas en el editor de texto vim y por lo tanto, a diferencia de otras herramientas, podremos editar los ficheros y guardar cambios en los mismos.

Linux: Diferencias entre dos archivos con vimdiff 

Los comandos a utilizar son los propios del editor de texto vim.

También podemos ejecutar el comando vim -d y obtendremos el mismo resultado que ejecutando vimdiff. 

vimdiff, también permite comparar ficheros remotos sobre SSH de forma directa.

Por ejemplo:

vimdiff /var/log/secure scp://192.168.1.25/var/log/secure

En este ejemplo, estamos comparando el fichero /var/log/secure local del equipo donde estamos ejecutando vimdiff, con el fichero /var/log/secure del equipo 192.168.1.25, utilizando SSH.

Al realizar la conexión vía SSH al equipo 192.168.1.25, nos pedirá las credenciales.

5 comentarios:

  1. ¡Muy bueno! Desconocía algunos. Por poner alguno más, hay un software, llamado MELD que lo hace todo de forma gráfica y está muy chulo.

    ResponderEliminar
    Respuestas
    1. ¡Muchas gracias por participar en el blog!

      Efectivamente, MELD está muy bien si quieres comparar ficheros desde entorno gráfico.

      Un saludo!

      Xavi.

      Eliminar
  2. Alguien puede ayudarme hacer un script con el cual compare dos ficheros y me indique cual de los 2 tiene mas lineas y que me indique tambien si ambos tiene el mismo número de lineas.

    ResponderEliminar
  3. Eso mismo lo puedes hacer con cat (salvo que quieres ver si tienen el mismo numero de lineas y si las lineas son iguales).

    ResponderEliminar