Saltar al contenido

comando diff en Linux con ejemplos

septiembre 23, 2021
gfg 200x200 min

diff significa diferencia. Este comando se utiliza para mostrar las diferencias en los archivos comparando los archivos línea por línea. A diferencia de sus compañeros, cmp y comm, nos dice qué líneas de un archivo deben cambiarse para que los dos archivos sean idénticos.

Lo importante a recordar es que diff usa ciertos simbolos especiales y instrucciones que se requieren para que dos archivos sean idénticos. Le indica las instrucciones sobre cómo cambiar el primer archivo para que coincida con el segundo archivo.

Los símbolos especiales son:

a : add
c : change
d : delete

Sintaxis:

diff [options] File1 File2 

Digamos que tenemos dos archivos con nombres un.txt y b.txt que contiene 5 estados de la India.

$ ls
a.txt  b.txt

$ cat a.txt
Gujarat
Uttar Pradesh
Kolkata
Bihar
Jammu and Kashmir

$ cat b.txt
Tamil Nadu
Gujarat
Andhra Pradesh
Bihar
Uttar pradesh

Ahora, aplicando diff comando sin ninguna opción obtenemos el siguiente resultado:

$ diff a.txt b.txt
0a1
> Tamil Nadu
2,3c3
< Uttar Pradesh
 Andhra Pradesh
5c5
 Uttar pradesh

Echemos un vistazo a lo que significa esta salida. La primera línea del diff la salida contendrá:

  • Números de línea correspondientes al primer archivo,
  • Un símbolo especial y
  • Números de línea correspondientes al segundo archivo.

Como en nuestro caso, 0a1 lo que significa después líneas 0 (al principio del archivo) debe agregar Tamil Nadu para que coincida con el número de línea 1 del segundo archivo. A continuación, nos dice cuáles son esas líneas en cada archivo precedido por el símbolo:

  • Líneas precedidas por un son líneas del primer archivo.
  • Líneas precedidas por > son líneas del segundo archivo.
  • La siguiente línea contiene 2,3c3 lo que significa que de la línea 2 a la línea 3 en el primer archivo debe cambiarse para que coincida con la línea número 3 en el segundo archivo. Luego nos dice esas líneas con los símbolos anteriores.
  • Los tres guiones («-«) simplemente separe las líneas del archivo 1 y el archivo 2.

Como resumen para que ambos archivos sean idénticos, primero agregue Tamil Nadu en el primer archivo al principio para que coincida con la línea 1 del segundo archivo, después de eso, cambie las líneas 2 y 3 del primer archivo, es decir Uttar Pradesh y Calcuta con la línea 3 del segundo archivo, es decir Andhra Pradesh. Después de eso, cambie la línea 5 del primer archivo, es decir. Jammu y Cachemira con la línea 5 del segundo archivo, es decir Uttar Pradesh.

Ahora veamos cómo se ve cuando diff nos dice que necesitamos borrar una línea.

$ cat a.txt
Gujarat
Andhra Pradesh
Telangana
Bihar
Uttar pradesh

$ cat b.txt
Gujarat
Andhra Pradesh
Bihar
Uttar pradesh

$ diff a.txt b.txt
3d2
< Telangana

Aquí arriba de la salida 3d2 significa eliminar la tercera línea del primer archivo, es decir Telangana para que ambos archivos sincronizar en la línea 2.

Opciones

El sistema Linux ofrece dos formas diferentes de ver el diff salida de comando, es decir modo de contexto y modo unificado.

1. -c (contexto): Para ver las diferencias en el modo de contexto, use el -C opción. Intentemos entender esto con un ejemplo, tenemos dos archivos file1.txt y file2.txt:

$ cat file1.txt                                                                                                                            
cat                                                                                                                                              
mv                                                                                                                                               
comm                                                                                                                                             
cp 

$ cat file2.txt
cat                                                                                                                                              
cp                                                                                                                                               
diff                                                                                                                                             
comm
                                                                                                   
$ diff -c file1.txt file2.txt                                                                                                              
*** file1.txt   Thu Jan 11 08:52:37 2018                                                                                                         
--- file2.txt   Thu Jan 11 08:53:01 2018                                                                                                         
***************                                                                                                                                  
*** 1,4 ****                                                                                                                                     
  cat                                                                                                                                            
- mv                                                                                                                                             
- comm                                                                                                                                           
  cp                                                                                                                                             
--- 1,4 ----                                                                                                                                     
  cat                                                                                                                                            
  cp                                                                                                                                             
+ diff                                                                                                                                           
+ comm 

El primer archivo está indicado por ***, y el segundo archivo está indicado por .
La linea con *************** es solo un separador.

Las dos primeras líneas de este resultado nos muestran información sobre archivo 1 y archivo 2. Enumera el nombre del archivo, la fecha de modificación y la hora de modificación de cada uno de nuestros archivos, uno por línea.
La siguiente línea tiene tres asteriscos *** seguido de un rango de línea desde el primer archivo (en nuestro caso, las líneas 1 a 4, separadas por una coma). Luego cuatro asteriscos ****. A continuación, muestra el contenido del primer archivo con los siguientes indicadores:

(I) Si la línea no debe modificarse, tiene como prefijo dos espacios.
(ii) Si es necesario cambiar la línea, se antepone un símbolo y un espacio. Los medios del símbolo son los siguientes:

(a) +: Indica una línea en el segundo archivo que debe agregarse al primer archivo para que sean idénticos.
(B) – : Indica una línea en el primer archivo que debe eliminarse para que sean idénticos.
Como en nuestro caso, es necesario borrar mv y com desde el primer archivo y agregue diff y com al primer archivo para que ambos sean idénticos.

Después de eso hay tres guiones. seguido de un rango de línea del segundo archivo (en nuestro caso, las líneas 1 a 4, separadas por una coma). Luego cuatro guiones —-. Luego muestra el contenido del segundo archivo.

2. -u (unificado): Para ver las diferencias en el modo unificado, utilice el -u opción. Es similar al modo de contexto pero no muestra ninguna información redundante o muestra la información de forma concisa.

$ cat file1.txt                                                                                                                            
cat                                                                                                                                              
mv                                                                                                                                               
comm                                                                                                                                             
cp 

$ cat file2.txt                                                                                                                            
cat                                                                                                                                              
cp                                                                                                                                               
diff                                                                                                                                             
comm

$ diff -u file1.txt file2.txt                                                                                                            
--- file1.txt   2018-01-11 10:39:38.237464052 +0000                                                                                              
+++ file2.txt   2018-01-11 10:40:00.323423021 +0000                                                                                              
@@ -1,4 +1,4 @@                                                                                                                                  
 cat                                                                                                                                             
-mv                                                                                                                                              
-comm                                                                                                                                            
 cp                                                                                                                                              
+diff                                                                                                                                            
+comm

El primer archivo está indicado por , y el segundo archivo se indica mediante +++.
Las dos primeras líneas de este resultado nos muestran información sobre archivo 1 y archivo 2. Enumera el nombre del archivo, la fecha de modificación y la hora de modificación de cada uno de nuestros archivos, uno por línea.
Después de eso, la siguiente línea tiene dos en el signo @ seguido de un rango de línea desde el primer archivo (en nuestro caso, las líneas 1 a 4, separadas por una coma) con el prefijo y luego espacio y luego de nuevo seguido por un rango de línea del segundo archivo prefijado por + y al final dos en señal @. Seguido por el contenido del archivo en la salida, nos dice qué línea permanece sin cambios y qué líneas deben agregarse o eliminarse (indicadas por símbolos) en el archivo 1 para hacerlo idéntico a archivo 2.

3. -i: Por defecto, este comando es distingue mayúsculas y minúsculas. Para hacer este comando mayúsculas y minúsculas usar -I opción con diff.

$ cat file1.txt
dog
mv
CP
comm

$ cat file2.txt
DOG
cp
diff
comm

Without using this option:
$ diff file1.txt file2.txt
1,3c1,3
< dog
< mv
 DOG
> cp
> diff

Using this option:
$ diff -i file1.txt file2.txt
2d1
 diff

4. –versión: Esta opción se utiliza para mostrar la versión de diff que se está ejecutando actualmente en su sistema.

$ diff --version
diff (GNU diffutils) 3.5
Packaged by Cygwin (3.5-2)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Eggert, Mike Haertel, David Hayes,
Richard Stallman, and Len Tower.

? t = 204
Referencias:
Conceptos y aplicaciones de Unix – Das, Sumitabha
Computadora…

close