Extracción de columnas con AWK

LinuxBeginner
Practicar Ahora

Introducción

Al trabajar con datos de texto estructurados en Linux, como archivos de registro, archivos CSV o archivos de configuración, a menudo necesitará extraer columnas específicas de información. Por ejemplo, puede que quiera obtener solo los nombres de usuario de un archivo del sistema o los códigos de estado de un registro de acceso web.

La herramienta principal para esta tarea es awk.

awk trata el texto como una serie de registros (líneas) y campos (columnas). Esta es una de las razones por las que el texto sin formato sigue siendo tan útil en Linux: muchos formatos de datos administrativos son fáciles de inspeccionar visualmente y de procesar con herramientas de la línea de comandos.

  • Los registros suelen estar separados por saltos de línea.
  • Los campos suelen estar separados por espacios en blanco (espacios o tabulaciones).

Este modelo de «registros y campos» es el marco mental que facilita la comprensión de awk. En lugar de ver un archivo como texto sin estructura, awk ve filas y columnas estructuradas a las que se puede hacer referencia directamente.

En este laboratorio aprenderá a usar awk para:

  1. Seleccionar campos: extraer columnas específicas mediante $1, $2, etc.
  2. Definir separadores de campos: procesar datos separados por caracteres distintos de los espacios, como dos puntos o comas, mediante la opción -F.
  3. Hacer referencia al último campo: acceder dinámicamente al final de una línea mediante $NF.

Extraer el primer campo

Comience con un archivo sencillo cuyos campos están separados por espacios. Ya hemos creado data.txt.

Muestre su contenido:

cat data.txt

Salida:

John 25 Engineer
Alice 30 Manager
Bob 22 Intern

Para awk, cada línea es un registro y cada palabra es un campo:

  • Campo 1 ($1): nombre (por ejemplo, John)
  • Campo 2 ($2): edad (por ejemplo, 25)
  • Campo 3 ($3): función (por ejemplo, Engineer)

Si solo quiere extraer los nombres, es decir, la primera columna, indique a awk que imprima $1.

En awk, $1, $2 y expresiones similares hacen referencia a los campos del registro actual. $0 representa la línea actual completa. Esta notación de campos es una de las razones por las que awk resulta tan conciso para procesar texto estructurado.

Ejecute el comando siguiente:

awk '{print $1}' data.txt

Salida:

John
Alice
Bob

Ahora guarde esta salida en un archivo:

awk '{print $1}' data.txt > output1.txt

Compruebe el contenido del archivo nuevo:

cat output1.txt

Comprender la separación de campos

Ahora pruebe con un formato de archivo diferente: /etc/passwd. Este archivo almacena información sobre las cuentas de usuario.

Muestre las primeras líneas de passwd:

head -n 3 /etc/passwd

La salida será parecida a: root:x:0:0:root:/root:/bin/bash

Observe que no hay espacios. En su lugar, los campos están separados por dos puntos (:).

Si ejecuta el comando predeterminado de awk en este archivo, no dividirá los campos correctamente porque, de forma predeterminada, espera espacios.

Pruébelo:

awk '{print $1}' /etc/passwd > output2.txt
head -n 3 output2.txt

Verá que imprime la línea completa. Como awk no encontró ningún espacio, trató toda la línea como un único campo ($1).

Para corregirlo, debe especificar un separador de campos personalizado.

Esta es una lección importante para el procesamiento de texto en situaciones reales: la herramienta solo será tan eficaz como lo sea su comprensión del formato de los datos. Si elige el separador incorrecto, las columnas que cree estar extrayendo no serán las columnas que awk reconoce.

Usar un separador de campos personalizado (-F)

Para convertir los datos separados por dos puntos en campos utilizables, use la opción -F.

El comando awk -F: indica a awk que utilice el carácter de dos puntos como delimitador entre las columnas.

La opción -F cambia la forma en que awk analiza cada línea antes de realizar cualquier impresión o aplicar lógica. Una vez que la línea se divide correctamente, las mismas referencias de campo, como $1 y $7, vuelven a tener sentido.

Ahora puede extraer campos específicos. En el archivo /etc/passwd:

  • El campo 1 es el nombre de usuario.
  • El campo 7 es el intérprete de comandos.

Extraiga solo el nombre de usuario y el intérprete de comandos. Puede imprimir varios campos separándolos con una coma.

awk -F: '{print $1, $7}' /etc/passwd > output3.txt

Compruebe el resultado:

head -n 5 output3.txt

La salida debería ser parecida a: root /bin/bash

awk dividió correctamente la línea en los dos puntos e imprimió los campos primero y séptimo, separados por un espacio en la salida.

Imprimir el último campo ($NF)

A veces no sabe exactamente cuántas columnas tiene una línea, o el número de columnas puede variar. Sin embargo, puede saber que los datos que necesita siempre están en la última columna.

awk proporciona una variable integrada llamada $NF (número de campos).

  • NF almacena el número de campos de la línea actual.
  • $NF hace referencia al valor del último campo.

Esto resulta útil porque hace que el comando dependa menos de números de columna escritos de forma fija. Cuando importa más la posición desde el final que el número absoluto de columna, NF y $NF suelen ofrecer mayor flexibilidad.

Extraiga la última columna de /etc/passwd mediante $NF.

awk -F: '{print $NF}' /etc/passwd > output4.txt

Compruebe la salida:

head -n 5 output4.txt

Esta salida debería corresponder nuevamente al intérprete de comandos, por ejemplo, /bin/bash, igual que con $7, suponiendo que la estructura del archivo sea coherente. El uso de $NF suele ser más robusto porque se adapta automáticamente al final de la línea.

Resumen

En este laboratorio ha aprendido los fundamentos del análisis de texto con awk:

  1. Extracción de campos ($N): acceder a columnas individuales de datos mediante $1, $2, etc.
  2. Separadores de campos (-F): procesar archivos con distintos delimitadores, como dos puntos o comas, mediante la opción -F.
  3. El último campo ($NF): acceder dinámicamente a la última columna de un registro.

Estas técnicas le permiten transformar texto estructurado sin procesar en flujos de datos limpios y utilizables para su posterior procesamiento.