Cómo usar el comando Awk para procesar un texto en Linux

1 mar 2021 5 min di lettura
Cómo usar el comando Awk para procesar un texto en Linux
Indice dei contenuti

Introducción

Awk es un lenguaje de programación genérico diseñado para procesamiento de texto avanzado. Se utiliza principalmente como herramienta de análisis e informes.

A diferencia de la mayoría de los otros lenguajes de programación que son de procedimiento, awk se basa en datos, lo que significa que usted define un conjunto de acciones que se realizarán en el texto de entrada. Toma los datos de entrada, los transforma y envía el resultado a la salida estándar.

Este artículo cubre los conceptos básicos del lenguaje de programación awk. Conocer los conceptos básicos de awk mejorará enormemente su capacidad para manipular archivos de texto desde la línea de comandos.

Cómo funciona Awk

Hay varias implementaciones de awk. Usaremos la implementación GNU de awk, que se llama gawk. En la mayoría de los sistemas Linux, el awk es solo un enlace simbólico a gawk.

Registros y campos

Awk procesa datos textuales, de archivos o transmisiones. Los datos de entrada se dividen en registros y campos. Awk opera en un registro a la vez hasta que se alcanza el final de la entrada. Los registros están separados por un carácter llamado separador de registros. El separador de registros predeterminado es el carácter de nueva línea, lo que significa que cada línea en los datos de texto es un registro. Puede establecer un nuevo separador de registros utilizando la variable RS

Los registros constan de campos separados por el separador de campos. De forma predeterminada, los campos están separados por un espacio, incluidos uno o más caracteres de tabulación, espacio y nueva línea.

Los campos de cada registro se indican mediante el signo de dólar ( $ ) seguido del número de campo, comenzando con 1. El primer campo se representa con $1, el segundo con $2 y así sucesivamente. También se puede hacer referencia al último campo con la variable especial $NF. Se puede hacer referencia a $0

A continuación, se muestra una representación visual que muestra cómo hacer referencia a registros y campos:

tmpfs 788M 1.8M 786M 1% /run/lock
 /dev/sda1 234G 191G 31G 87% /|-------| |--| |--| |--| |-| |--------|
 $1 $2 $3 $4 $5 $6 ($NF) --> fields
 |-----------------------------------------|
 $0 --> record

Programa awk

Para procesar texto con awk escriba un programa que le diga al comando qué hacer. Los programas constan de un conjunto de reglas y funciones definidas por el usuario. Cada regla contiene un patrón y un par de acciones. Las reglas están separadas por líneas nuevas o punto y coma ;. Normalmente, un programa awk se ve así:

pattern { action }
 pattern { action }...

Cuando awk procesa datos, si el patrón coincide con el registro, realiza la acción especificada en ese registro. Cuando la regla no tiene patrón, todos los registros (filas) coinciden.

Una acción awk se {} y consta de declaraciones. Cada declaración especifica la operación a realizar. Una acción puede tener más de una instrucción separada por líneas nuevas o punto y coma ;. Si la regla no tiene ninguna acción, imprime el registro completo de forma predeterminada.

Awk admite varios tipos de declaraciones, incluidas expresiones, condicionales, entradas, declaraciones de salida y más. Las declaraciones awk más comunes son:

  • exit: detiene la ejecución de todo el programa y sale.
  • next: detiene el procesamiento del registro actual y pasa al siguiente registro en los datos de entrada.
  • print: imprime registros, campos, variables y texto personalizado.
  • printf: te da más control sobre el formato de salida, similar a C y bash printf.

Al escribir programas awk, todo lo que sigue al signo de almohadilla (#) y hasta el final de la línea se considera un comentario. Las líneas largas se pueden dividir en varias líneas usando el carácter de continuación, barra invertida \.

Ejecutando programas awk

Un programa awk se puede ejecutar de varias formas. Si el programa es corto y simple, se puede pasar directamente al awk desde la línea de comando:

awk 'program' input-file...

Cuando se ejecuta el programa desde la línea de comandos, debe estar entre comillas simples '', para que el shell no interprete el programa.

Si el programa es grande y complejo, es mejor ponerlo en un archivo y usar la -f para pasar el archivo al comando awk

awk -f program-file input-file...

En los siguientes ejemplos usaremos un archivo llamado "teams.txt" que se parece al siguiente:

Bucks Milwaukee 60 22 0.732
 Raptors Toronto 58 24 0.707
 76ers Philadelphia 51 31 0.622
 Celtics Boston 49 33 0.598
 Pacers Indiana 48 34 0.585

Modelos awk

Los patrones en awk controlan si la acción asociada debe realizarse o no.

Awk admite varios tipos de patrones, incluidos los patrones de expresión regular, expresión de relación, rango y expresión especial.

Cuando la regla no tiene patrón, se hace coincidir cada registro de entrada. A continuación, se muestra un ejemplo de una regla que contiene solo una acción:

awk '{ print $3 }' teams.txt

El programa imprimirá el tercer campo de cada registro:

60
 58
 51
 49
 48

Patrones de expresión regular

Una expresión regular o regex es un patrón que coincide con una serie de cadenas. Los patrones de expresión regular Awk están encerrados entre barras //:

/regex pattern/{ action }

El ejemplo más simple es un carácter literal o una coincidencia de cadena. Por ejemplo, para mostrar el primer campo de cada registro que contiene "0.5", debe ejecutar el siguiente comando:

awk '/0.5/{ print $1 }' teams.txt
Celtics
 Pacers

El patrón puede ser cualquier tipo de expresión regular extendida. Aquí hay un ejemplo que imprime el primer campo si el registro comienza con dos o más dígitos:

awk '/^[0-9][0-9]/{ print $1 }' teams.txt
76ers

Esquemas de expresiones relacionales

Los patrones de expresión relacional se utilizan generalmente para hacer coincidir el contenido de un campo o variable específico.

De forma predeterminada, los patrones de expresión regular se comparan con los registros. Para hacer coincidir una expresión regular con un campo, especifique el campo y use el operador de comparación "contener" ~.

Por ejemplo, para imprimir el primer campo de cada registro cuyo segundo campo contiene "ia", escriba:

awk '$2 ~ /ia/{ print $1 }' teams.txt
76ers
 Pacers

Para hacer coincidir campos que no contienen un patrón determinado, utilice el !~ Operador:

awk '$2!~ /ia/{ print $1 }' teams.txt
Bucks
 Raptors
 Celtics

Puede comparar cadenas o números para relaciones como, mayor que, menor que, igual, etc. El siguiente comando imprime el primer campo de todos los registros cuyo tercer campo es mayor que 50:

awk '$3 > 50 { print $1 }' teams.txt
Bucks
 Raptors
 76ers

Modelos de gama

Las plantillas de rango constan de dos patrones separados por una coma:

pattern1, pattern2

Todos los registros que comienzan con un registro que coincide con el primer patrón hasta que se empareja un registro que coincide con el segundo patrón.

Aquí hay un ejemplo que imprimirá el primer campo de todos los registros que comienzan con el registro que incluye "Raptors" hasta el registro que incluye "Celtics":

awk '/Raptors/,/Celtics/{ print $1 }' teams.txt
Raptors
 76ers
 Celtics

Los esquemas también pueden ser expresiones de relación. El siguiente comando imprimirá todos los registros comenzando con aquel cuyo cuarto campo es igual a 32 hasta el que tiene el cuarto campo es igual a 33:

awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622
 Celtics Boston 49 33 0.598

Los patrones de intervalo no se pueden combinar con otras expresiones de patrones.

Patrones de expresión especiales

Awk incluye los siguientes patrones especiales:

  • BEGIN: se utiliza para realizar acciones antes de que se procesen los registros.
  • END: se utiliza para realizar acciones después de procesar los registros.

El BEGIN se usa generalmente para establecer variables y el END para procesar datos de registros como cálculo.

El siguiente ejemplo imprimirá "Iniciar procesamiento", luego imprimirá el tercer campo de cada registro y finalmente "Finalizar procesamiento":

awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing.
 60
 58
 51
 49
 48
 End Processing.

Si un programa tiene solo un BEGIN, las acciones se realizan y la entrada no se procesa. Si un programa solo tiene un END, la entrada se procesa antes de ejecutar las acciones de la regla.

La versión Gnu de awk también incluye otros dos esquemas especiales BEGINFILE y ENDFILE que le permiten realizar acciones mientras procesa archivos.

Combinación de modelos

Awk le permite combinar dos o más patrones usando el operador lógico AND && y el operador lógico OR

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.