Comparación de líneas comunes en Linux

LinuxBeginner
Practicar Ahora

Introducción

En el entorno Linux, comparar archivos es una tarea común para administradores de sistemas y desarrolladores. El comando comm es una herramienta poderosa que permite a los usuarios comparar dos archivos de texto ordenados línea por línea e identificar las líneas únicas y comunes entre ellos.

Esta práctica (lab) te guiará en el uso del comando comm para analizar archivos de texto. Aprenderás cómo crear archivos de prueba, comparar su contenido y extraer información específica de los resultados de la comparación. Al final de esta práctica, tendrás una comprensión sólida de cómo usar este versátil comando para tareas de comparación de archivos en Linux.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 100%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Prepara tus archivos de texto

Antes de poder usar el comando comm, necesitamos crear algunos archivos de texto de muestra con los que trabajar. En este paso, crearemos dos archivos de texto que contengan listas de comandos comunes de Linux.

Primero, creemos un directorio de trabajo para organizar nuestros archivos:

mkdir -p ~/project/comm-lab
cd ~/project/comm-lab

Ahora, creemos nuestro primer archivo de texto llamado commands1.txt con una lista de comandos de Linux:

echo -e "ls\ncd\npwd\nmkdir\ntouch\ncomm\nsed\nawk" | sort > commands1.txt

Este comando hace lo siguiente:

  • echo -e muestra el texto interpretando las secuencias de escape de barra invertida (\n crea nuevas líneas)
  • La lista de comandos se canaliza (|) al comando sort para ordenar alfabéticamente los elementos
  • La salida ordenada se redirige (>) a un archivo llamado commands1.txt

Creemos un segundo archivo de texto llamado commands2.txt con una lista de comandos ligeramente diferente:

echo -e "ls\ncd\npwd\ncomm\ngrep\nfind\nsed" | sort > commands2.txt

Para verificar que nuestros archivos se crearon correctamente, podemos usar el comando cat para ver su contenido:

cat commands1.txt

Deberías ver la siguiente salida:

awk
cd
comm
ls
mkdir
pwd
sed
touch

Ahora, veamos el contenido del segundo archivo:

cat commands2.txt

Deberías ver:

cd
comm
find
grep
ls
pwd
sed

Observa que algunos comandos aparecen en ambos archivos (como cd, ls, pwd, comm, sed), mientras que otros son únicos en cada archivo. Esta configuración nos permitirá demostrar varias características del comando comm en los siguientes pasos.

Usando el comando básico comm

Ahora que tenemos nuestros archivos de texto ordenados listos, podemos explorar el uso básico del comando comm. El comando comm compara dos archivos ordenados línea por línea y muestra tres columnas:

  1. Líneas únicas del primer archivo
  2. Líneas únicas del segundo archivo
  3. Líneas comunes a ambos archivos

Ejecutemos el comando básico comm para comparar nuestros dos archivos:

cd ~/project/comm-lab
comm commands1.txt commands2.txt

Deberías ver una salida similar a esta:

awk
  cd
  comm
 find
 grep
  ls
mkdir
  pwd
  sed
touch

La salida puede parecer confusa al principio, pero sigue un formato específico:

  • Columna 1 (sin tabulaciones al principio de la línea): Líneas solo en commands1.txt (awk, mkdir, touch)
  • Columna 2 (una tabulación al principio): Líneas solo en commands2.txt (find, grep)
  • Columna 3 (dos tabulaciones al principio): Líneas comunes a ambos archivos (cd, comm, ls, pwd, sed)

Esta salida predeterminada te permite ver todas las diferencias y similitudes a la vez, pero puede ser difícil de leer debido al formato de tabulaciones. En el siguiente paso, aprenderemos cómo hacer que esta salida sea más útil utilizando las opciones del comando comm.

Suprimiendo columnas con opciones de comm

La salida predeterminada del comando comm puede ser difícil de leer debido a su formato de columnas. Afortunadamente, comm proporciona opciones para suprimir columnas específicas, lo que facilita extraer solo la información que necesitas.

Las opciones son:

  • -1 : Suprime la columna 1 (líneas únicas del primer archivo)
  • -2 : Suprime la columna 2 (líneas únicas del segundo archivo)
  • -3 : Suprime la columna 3 (líneas comunes a ambos archivos)

Estas opciones se pueden combinar para mostrar solo los datos en los que estás interesado.

Encontrar líneas únicas del primer archivo

Para mostrar solo las líneas que son únicas del primer archivo (commands1.txt), usamos las opciones -2 y -3 para suprimir las columnas 2 y 3:

cd ~/project/comm-lab
comm -23 commands1.txt commands2.txt

Salida:

awk
mkdir
touch

Estos son los comandos que aparecen solo en commands1.txt.

Encontrar líneas únicas del segundo archivo

De manera similar, para mostrar solo las líneas que son únicas del segundo archivo (commands2.txt), usamos las opciones -1 y -3:

comm -13 commands1.txt commands2.txt

Salida:

find
grep

Estos son los comandos que aparecen solo en commands2.txt.

Encontrar líneas comunes

Para mostrar solo las líneas que son comunes a ambos archivos, usamos las opciones -1 y -2:

comm -12 commands1.txt commands2.txt

Salida:

cd
comm
ls
pwd
sed

Estos son los comandos que aparecen en ambos archivos.

Guardar resultados en archivos

A menudo es útil guardar estos resultados en archivos separados para futuras referencias o procesamiento. Hagamos eso:

comm -23 commands1.txt commands2.txt > unique_to_file1.txt
comm -13 commands1.txt commands2.txt > unique_to_file2.txt
comm -12 commands1.txt commands2.txt > common_lines.txt

Verifiquemos el contenido de estos nuevos archivos:

echo "Contents of unique_to_file1.txt:"
cat unique_to_file1.txt
echo "Contents of unique_to_file2.txt:"
cat unique_to_file2.txt
echo "Contents of common_lines.txt:"
cat common_lines.txt

La salida mostrará las líneas únicas de cada archivo y las líneas comunes, tal como vimos en nuestros comandos anteriores.

Estas técnicas son útiles para comparar archivos de configuración, encontrar diferencias entre versiones de un archivo o identificar elementos compartidos entre conjuntos de datos.

Ejemplos prácticos de uso de comm

Ahora que entiendes el uso básico del comando comm, exploremos algunos ejemplos prácticos que demuestren su utilidad en escenarios del mundo real.

Ejemplo 1: Encontrar nuevas entradas

Imagina que tienes dos listas de usuarios: una de la semana pasada y otra de hoy. Quieres identificar qué usuarios son nuevos (agregados desde la semana pasada).

Creemos estos archivos:

cd ~/project/comm-lab
echo -e "user1\nuser2\nuser3\nuser4\nuser5" | sort > users_last_week.txt
echo -e "user1\nuser3\nuser5\nuser6\nuser7\nuser8" | sort > users_today.txt

Para encontrar los nuevos usuarios (en users_today.txt pero no en users_last_week.txt):

comm -13 users_last_week.txt users_today.txt

Salida:

user6
user7
user8

Ejemplo 2: Encontrar entradas eliminadas

Usando los mismos archivos, encontremos qué usuarios se han eliminado desde la semana pasada:

comm -23 users_last_week.txt users_today.txt

Salida:

user2
user4

Ejemplo 3: Combinar comm con otros comandos

El comando comm se puede combinar con otros comandos para operaciones más complejas. Por ejemplo, si queremos contar cuántos comandos comunes hay en nuestros archivos originales:

comm -12 commands1.txt commands2.txt | wc -l

Esto envía las líneas comunes al comando wc -l, que cuenta el número de líneas.

Salida:

5

Esto indica que hay 5 comandos comunes a ambos archivos.

Ejemplo 4: Usar comm con archivos desordenados

El comando comm requiere archivos de entrada ordenados. Si intentas usarlo con archivos desordenados, es posible que obtengas resultados incorrectos. Demostremos esto:

echo -e "cat\nls\npwd\ncd" > unsorted1.txt
echo -e "ls\ncat\ngrep\npwd" > unsorted2.txt

Si intentamos usar comm directamente:

comm unsorted1.txt unsorted2.txt

La salida puede ser engañosa porque los archivos no están ordenados. El enfoque correcto es ordenar los archivos primero:

comm <(sort unsorted1.txt) <(sort unsorted2.txt)

Esto utiliza la sustitución de procesos para ordenar los archivos sobre la marcha antes de compararlos. Deberías ver un resultado con formato adecuado y las columnas correctas.

Estos ejemplos demuestran la versatilidad del comando comm para comparar archivos de texto en diversos escenarios, como el seguimiento de cambios, la búsqueda de diferencias y el filtrado de datos.

Resumen

En este laboratorio, aprendiste cómo usar el comando comm en Linux para comparar archivos de texto e identificar las diferencias entre ellos. Aquí está un resumen de lo que lograste:

  1. Creaste archivos de texto ordenados para comparación utilizando comandos básicos de Linux.
  2. Utilizaste el comando básico comm para comparar dos archivos y entender su formato de salida de tres columnas.
  3. Aplicaste opciones de supresión de columnas (-1, -2, -3) para extraer información específica:
    • Líneas únicas del primer archivo.
    • Líneas únicas del segundo archivo.
    • Líneas comunes a ambos archivos.
  4. Guardaste los resultados de la comparación en archivos separados para futuras referencias.
  5. Exploraste ejemplos prácticos de uso de comm en escenarios del mundo real:
    • Encontrar nuevas entradas en listas actualizadas.
    • Identificar entradas eliminadas.
    • Combinar comm con otros comandos para operaciones más complejas.
    • Manejar adecuadamente archivos desordenados.

El comando comm es una herramienta poderosa para la comparación de archivos de texto en Linux. Permite a administradores de sistemas, desarrolladores y analistas de datos identificar de manera eficiente las diferencias y similitudes entre archivos, lo cual es esencial para tareas como la gestión de configuraciones, el control de versiones y el análisis de datos.

Comprender cómo usar efectivamente comm y sus opciones mejorará tu productividad cuando trabajes con archivos de texto en el entorno de la línea de comandos de Linux.