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 bashprintf
.
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