Comando awk

awk

El comando awk es un potente lenguaje de programación orientado a la extracción, procesamiento, filtrado y estructuración de textos basados en flujos o ficheros delimitados por campos o columnas, siendo una de las herramientas de análisis más versátiles en entornos Unix y Linux.

Categoría Procesamiento de texto y análisis de datos en la terminal
Disponible en Linux, macOS y sistemas operativos tipo Unix
Equivalente en Windows Scripts avanzados en PowerShell (utilizando métodos como Split o selección de propiedades), o utilidades de análisis de texto de terceros.
Sustituye a La escritura de scripts complejos en lenguajes pesados para tareas sencillas de extracción tabular de columnas en ficheros de registro.
¿Requiere permisos de administrador? No, salvo que se ejecute para procesar archivos de registro o configuración protegidos ubicados en directorios del sistema (como /var/log o /etc).

¿Qué significa su nombre?

AWK es un acrónimo formado por las iniciales de los apellidos de sus tres creadores en los laboratorios Bell en 1977: Aho, Weinberger y Kernighan.

Representa tanto el nombre de la utilidad de procesamiento como el propio lenguaje estructurado que utiliza para analizar patrones en flujos de datos estructurados.

¿Para qué sirve?

El comando awk sirve para procesar archivos de texto estructurados dividiéndolos automáticamente en registros (habitualmente líneas) y campos (columnas separadas por espacios, tabuladores u otros delimitadores). Permite realizar operaciones aritméticas, filtrados condicionales avanzados y transformaciones complejas de columnas al vuelo sin necesidad de programar un script largo.

Es la herramienta definitiva para extraer datos tabulares específicos de salidas de comandos del sistema (como df, ps o free), generando informes limpios y personalizados de forma rápida y eficiente.

Sintaxis

awk 'condición { acción }' [fichero...]

Las variables internas y patrones más habituales son:

Variable o Patrón Descripción
$0 Representa la línea completa que se está procesando en el flujo actual.
$1, $2, $3... Representan la primera, segunda, tercera y sucesivas columnas (campos) de la línea actual.
NR (Number of Record) Variable interna que almacena el número de registro o línea actual que se está analizando.
NF (Number of Field) Variable interna que indica el número total de columnas o campos detectados en la línea actual.
-F [delimitador] Opción de sintaxis externa para definir un separador de campos personalizado (por ejemplo, -F":" para ficheros como /etc/passwd).

Comandos más utilizados

Comando Descripción
awk '{print $1}' fichero.txt Imprime únicamente la primera columna de cada línea del archivo.
awk -F":" '{print $1, $6}' /etc/passwd Utiliza los dos puntos como separador para mostrar el usuario y su directorio personal.
awk '$3 > 1000' datos.txt Filtra y muestra únicamente aquellas líneas donde el valor numérico de la tercera columna sea mayor a 1000.
awk 'NR >= 2 && NR <= 5' fichero.txt Extrae y muestra de forma exacta las líneas comprendidas entre la 2 y la 5.

Equivalencia con otros sistemas

Acción Linux (awk) Linux alternativo Windows (PowerShell)
Imprimir columna específica awk '{print $2}' file cut -d' ' -f2 file Get-Content file | ForEach-Object { ($_.Split())[1] }
Filtrar por condición numérica awk '$2 > 50' file No directo (requiere bucles) Get-Content file | Where-Object { $_.Split()[1] -gt 50 }
Cambiar delimitador de columnas awk -F',' '{print $1}' file cut -d',' -f1 file Import-Csv file | Select-Object -ExpandProperty Col1

Ejemplos

Imprimir la primera y la última columna de un listado de procesos

ps aux | awk '{print $1, $11}'

Filtrar y mostrar usuarios del sistema utilizando un delimitador personalizado (dos puntos)

awk -F':' '{print "Usuario:", $1, "- Shell:", $7}' /etc/passwd

Utilizar una condición lógica para filtrar filas según el valor numérico de una columna

ls -l | awk '$5 > 1024 {print $9, "ocupa", $5, "bytes"}'

Emplear las variables internas de control de líneas (NR y NF)

awk 'NR <= 3 {print NR, "-> Columnas:", NF, "-> Línea:", $0}' /etc/hosts

Ejemplo de salida

root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
sync /bin/sync

¿Cómo interpretar la salida?

  • Campos seleccionados: muestra de manera limpia únicamente las columnas solicitadas en la orden print, ignorando el resto de datos de la línea original.
  • Formateo integrado: permite combinar cadenas de texto estáticas y variables dinámicas (como $1 o separadores de formato) para estructurar informes legibles al instante.

Errores habituales

  • Olvidar delimitar el script de awk entre comillas simples (' '), lo que provoca que el intérprete de comandos de la terminal intente evaluar incorrectamente los símbolos de dólar ($1, $2) como variables del shell.
  • No definir correctamente el separador de campos con la opción -F cuando se procesan ficheros estructurados que no utilizan espacios en blanco por defecto (como los archivos separados por comas o por dos puntos).

Conceptos relacionados

  • Procesamiento de flujos estructurados
  • Campos y registros
  • Expresiones regulares en awk
  • Comando cut
  • Comando sed

Comandos relacionados

  • sed
  • grep
  • cut
  • tr
  • sort

Curiosidades

Aunque a menudo se utiliza simplemente como una utilidad rápida de la terminal para extraer columnas, awk es en realidad un lenguaje de programación completo con capacidad para declarar variables, utilizar bucles condicionales, funciones matemáticas y arrays asociativos, lo que le otorga una potencia desproporcionada para resolver problemas complejos de análisis de datos en pocas líneas.

Prácticas propuestas

  1. Ejecuta el comando básico df -h en tu máquina virtual para ver el espacio en disco, y utiliza awk para mostrar únicamente la primera columna (sistema de archivos) y la cuarta columna (espacio disponible).
  2. Investiga cómo utilizar la opción -F para procesar el archivo del sistema /etc/passwd y extraer únicamente los nombres de usuario y sus rutas de directorio personal asignadas.
  3. Crea un fichero de texto plano de pruebas con varias columnas numéricas y utiliza awk para aplicar un filtro lógico que imprima solo las filas donde una columna específica supere un determinado valor umbral.
  4. Utiliza las variables internas NR y NF en un comando awk para numerar las líneas de un archivo de texto e indicar cuántas columnas componen cada registro.
  5. Compara la sintaxis y la complejidad de extraer una columna concreta de un archivo utilizando awk frente a la herramienta clásica de corte de campos cut.

Consejo: Recuerda siempre envolver el código de programación de awk entre comillas simples; de esta forma evitarás que tu terminal intente interpretar los símbolos de columna ($1, $2) antes de pasárselos a la utilidad.

Haz clic aquí para ver las soluciones y explicaciones

1. Ejecuta el comando básico df -h en tu máquina virtual para ver el espacio en disco, y utiliza awk para mostrar únicamente la primera columna (sistema de archivos) y la cuarta columna (espacio disponible).

Para combinar ambos comandos mediante un flujo (pipe) y extraer las columnas deseadas, se ejecuta: df -h | awk '{print $1, $4}'. Esto filtrará la salida tabular por defecto del comando de espacio en disco mostrando de forma limpia los campos correspondientes.


2. Investiga cómo utilizar la opción -F para procesar el archivo del sistema /etc/passwd y extraer únicamente los nombres de usuario y sus rutas de directorio personal asignadas.

Dado que /etc/passwd utiliza los dos puntos (:) como separador de campos, se emplea el parámetro -F indicando dicho carácter y seleccionando la primera ($1) y la sexta ($6) columna: awk -F':' '{print $1, $6}' /etc/passwd.


3. Crea un fichero de texto plano de pruebas con varias columnas numéricas y utiliza awk para aplicar un filtro lógico que imprima solo las filas donde una columna específica supere un determinado valor umbral.

Para filtrar líneas de manera condicional, se coloca la regla numérica antes de la acción entre llaves. Por ejemplo, para filtrar un archivo llamado datos.txt donde la segunda columna sea mayor de 50, se utiliza: awk '$2 > 50 {print $0}' datos.txt (o simplemente awk '$2 > 50' datos.txt, ya que la acción de imprimir la línea completa es el comportamiento predeterminado).


4. Utiliza las variables internas NR y NF en un comando awk para numerar las líneas de un archivo de texto e indicar cuántas columnas componen cada registro.

Combinando las variables internas de número de registro (NR) y número de campos (NF) junto con el texto completo ($0), la sintaxis sería: awk '{print "Línea:", NR, "| Columnas:", NF, "| Contenido:", $0}' fichero.txt. Esto genera un informe detallado de la estructura interna del archivo.


5. Compara la sintaxis y la complejidad de extraer una columna concreta de un archivo utilizando awk frente a la herramienta clásica de corte de campos cut.

Mientras que cut es una herramienta extremadamente sencilla y directa cuando las columnas están separadas por un delimitador estricto (por ejemplo, cut -d':' -f1 fichero), awk es mucho más potente y flexible porque no le afectan los espacios múltiples consecutivos (a diferencia de cut, que requiere configuraciones adicionales si los separadores varían en longitud o se basan en espacios en blanco dinámicos).