comando diff en Linux con ejemplos

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

Lo importante que debe recordar es que diff usa ciertos símbolos e instrucciones especiales que se requieren para hacer 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 a.txt y b.txt que contienen 5 estados indios.  

$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 el comando diff 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 de la salida diff 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 que después de las 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. Luego nos dice cuáles son esas líneas en cada archivo precedido por el símbolo:  

  • Las líneas precedidas por un < son líneas del primer archivo.
  • Las 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 separan 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, luego cambie las líneas 2 y 3 del primer archivo, es decir, Uttar Pradesh y Kolkata 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 , por la línea 5 del segundo archivo, es decir, Uttar Pradesh

Ahora veamos cómo se ve cuando diff nos dice que necesitamos eliminar 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í, la salida 3d2 anterior significa eliminar la línea 3 del primer archivo, es decir, Telangana , para que ambos archivos se sincronicen en la línea 2. 

Opciones

El sistema Linux ofrece dos formas diferentes de ver la salida del comando diff , es decir, el modo contextual y el modo unificado

1. -c (contexto): para ver las diferencias en el modo de contexto, use la opción -c . Tratemos de 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 se indica con *** y el segundo archivo se indica con
La línea con *************** es solo un separador. 

Las primeras dos líneas de esta salida nos muestran información sobre el archivo 1 y el 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 *** seguidos de un rango de líneas del primer archivo (en nuestro caso, las líneas 1 a 4, separadas por una coma). Luego cuatro asteriscos **** . Después de eso, muestra el contenido del primer archivo con los siguientes indicadores: 

(i) Si la línea debe permanecer sin cambios, se antepone con dos espacios. 
(ii) Si es necesario cambiar la línea, se antepone un símbolo y un espacio. Los significados de los símbolos son los siguientes: 

(a) + : Indica una línea en el segundo archivo que debe agregarse al primer archivo para hacerlos 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 eliminar mv y comm del primer archivo y agregar diff y comm al primer archivo para que ambos sean idénticos. 

Después de eso, hay tres guiones , seguidos de un rango de líneas 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 modo unificado, utilice la opción -u . Es similar al modo de contexto pero no muestra ninguna información redundante o muestra la información en 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 se indica con y el segundo archivo se indica con +++
Las primeras dos líneas de esta salida nos muestran información sobre el archivo 1 y el 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 arrobas @ seguidas de un rango de líneas del primer archivo (en nuestro caso, las líneas 1 a 4, separadas por una coma) con el prefijo y luego un espacio y luego otra vez seguido de un rango de líneas del segundo archivo precedido por + y al final dos en el signo @. 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 que sea idéntico al archivo 2

3. -i: De forma predeterminada, este comando distingue entre mayúsculas y minúsculas . Para hacer que este comando no distinga entre mayúsculas y minúsculas, use la opción -i 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. –version: esta opción se usa 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  
Computer Hope
 

Publicación traducida automáticamente

Artículo escrito por AKASH GUPTA 6 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *