Awk es un lenguaje de scripting de propósito general diseñado para el procesamiento avanzado de texto. Se utiliza principalmente como herramienta de presentación de informes y análisis.
a diferencia de la mayoría de los otros lenguajes de programación que son procedimentales, awk está basado en datos, lo que significa que se define un conjunto de acciones que se realizarán contra 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 lo esencial del lenguaje de programación awk., Conocer los conceptos básicos de awk mejorará significativamente su capacidad para manipular archivos de texto en la línea de comandos.
cómo funciona awk #
hay varias implementaciones diferentes de awk. Usaremos la implementación GNU de awk, que se llama gawk. En la mayoría de los sistemas Linux, el intérprete awk
es solo un enlace simbólico a gawk
.
registros y campos #
Awk puede procesar archivos de datos textuales y flujos. 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. Se puede establecer un nuevo separador de registros utilizando la variable RS
.
Los registros consisten en campos que están separados por el separador de campos. De forma predeterminada, los campos están separados por un espacio en blanco, que incluye uno o más caracteres de tabulación, espacio y línea nueva.
los campos de cada registro están referenciados por el signo de Dólar ($
) seguido por el número de campo, comenzando con 1., El primer campo se representa con $1
, el segundo con $2
, y así sucesivamente. El último campo también se puede referenciar con la variable especial $NF
. Se puede hacer referencia a todo el registro con $0
.
Aquí hay 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
Awk program #
para procesar un texto con awk
, escriba un programa que le diga al comando qué hacer., El programa consta de una serie 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 una nueva línea 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 (líneas) coinciden.
una acción awk está encerrada entre llaves ({}
) y consiste en sentencias., Cada instrucción especifica la operación a realizar. Una acción puede tener más de una instrucción separada por línea nueva o puntos y coma (;
). Si la regla no tiene acción, por defecto imprime todo el registro.
Awk admite diferentes tipos de instrucciones, incluidas expresiones, condicionales, instrucciones de entrada, de salida y más. Las sentencias awk más comunes son:
-
exit
– detiene la ejecución de todo el programa y sale., -
next
– Deja de procesar el registro actual y se mueve al siguiente registro en los datos de entrada. -
print
– imprime registros, campos, variables y texto personalizado. -
printf
– le da más control sobre el formato de salida, similar a C y bashprintf
.
al escribir programas awk, todo lo que va después de la marca de hash (#)
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 (\
).
ejecutar programas awk #
Un programa awk se puede ejecutar de varias maneras. Si el programa es corto y simple, se puede pasar directamente al intérprete awk
en la línea de comandos:
awk 'program' input-file...
cuando se ejecuta el programa en la línea de comandos, debe estar entre comillas simples (''
), así que el Shell no interpreta el programa.,
si el programa es grande y complejo, lo mejor es ponerlo en un archivo y usar la opción -f
para pasar el archivo al comando awk
:
awk -f program-file input-file...
en los ejemplos a continuación, utilice un archivo llamado «equipos.txt » que se parece a la siguiente:
Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598Pacers Indiana 48 34 0.585
Awk Patterns #
Patterns in awk control whether the associated action should be executed or not.,
Awk admite diferentes 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 un patrón, cada registro de entrada coincide. Aquí hay 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:
6058514948
Patrones de expresión Regular #
una expresión regular o expresión regular es un patrón que coincide con un conjunto de cadenas., Los patrones de expresión regular Awk están encerrados en barras (//
):
/regex pattern/ { action }
el ejemplo más básico es un carácter literal o una coincidencia de cadena. Por ejemplo, para mostrar el primer campo de cada registro que contiene «0.5», ejecute el siguiente comando:
awk '/0.5/ { print $1 }' teams.txt
CelticsPacers
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 '/^/ { print $1 }' teams.txt
76ers
patrones de expresiones relacionales #
Los patrones de expresiones relacionales generalmente se usan para coincidir con el contenido de un campo o variable específica.
de forma predeterminada, los patrones de expresiones regulares se comparan con los registros. Para comparar una expresión regular con un campo, especifique el campo y utilice el operador de comparación «contain» (~
) contra el patrón.,
por ejemplo, para imprimir el primer campo de cada registro cuyo segundo campo contiene «ia», debe escribir:
awk '$2 ~ /ia/ { print $1 }' teams.txt
76ersPacers
para coincidir con campos que no contienen un patrón dado, use el operador !~
:
awk '$2 !~ /ia/ { print $1 }' teams.txt
BucksRaptorsCeltics
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
BucksRaptors76ers
patrones de rango #
Los patrones de rango consisten en 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 coincide con un registro que coincide con el segundo patrón.,
Aquí hay un ejemplo que imprimirá el primer campo de todos los registros a partir del registro que incluye «Raptors» hasta el registro que incluye «Celtics»:
awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors76ersCeltics
Los patrones también pueden ser expresiones de relación. El comando a continuación imprimirá todos los registros a partir de aquel cuyo cuarto campo es igual a 32 hasta aquel cuyo cuarto campo es igual a 33:
awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622Celtics Boston 49 33 0.598
Los patrones de Rango no se pueden combinar con otras expresiones de patrón.,
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 patrónBEGIN
se usa generalmente para establecer variables y el patrón END
para procesar datos de los registros, como el cálculo.
el siguiente ejemplo mostrará » Start Processing.», luego imprima el tercer campo de cada registro y finalmente » finalizar procesamiento.,»:
awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing6058514948End Processing.
Si un programa tiene sólo un BEGIN
patrón, se ejecutan las acciones, y la entrada no es procesado. Si un programa solo tiene un patrón END
, la entrada se procesa antes de realizar las acciones de la regla.
la versión Gnu de awk también incluye dos patrones especiales más BEGINFILE
y ENDFILE
, que le permite realizar acciones al procesar archivos.,
la Combinación de patrones #
Awk permite combinar dos o más patrones utilizando el operador lógico and (&&
) y el operador lógico or (||
).,
Aquí hay un ejemplo que utiliza el operador &&
para imprimir el primer campo de aquellos registros cuyo tercer campo es mayor que 50 y el cuarto campo es menor que 30:
awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
BucksRaptors
awk tiene una serie de variables integradas que contienen información útil y le permite controlar cómo se procesa el programa. A continuación se muestran algunas de las Variables integradas más comunes:
-
NF
-el número de campos en el registro.,
-
NR
– El número del registro actual.
-
FILENAME
– El nombre del archivo de entrada que actualmente es procesado.
-
FS
separador de Campo.
-
RS
separador de Registro.
-
OFS
– separador de campo de salida.
-
ORS
– separador de registros de salida.,
NF
-el número de campos en el registro.,NR
– El número del registro actual.FILENAME
– El nombre del archivo de entrada que actualmente es procesado.FS
separador de Campo.RS
separador de Registro.OFS
– separador de campo de salida.ORS
– separador de registros de salida.,Aquí hay un ejemplo que muestra cómo imprimir el nombre del archivo y el número de líneas (registros):
awk 'END { print "File", FILENAME, "contains", NR, "lines." }' teams.txt
File teams.txt contains 5 lines.
las Variables en AWK se pueden establecer en cualquier línea del programa. Para definir una variable para todo el programa, póngala en un patrón BEGIN
.
cambiar el separador de Campos y registros #
el valor predeterminado del separador de Campos es cualquier número de caracteres de espacio o tabulación. Se puede cambiar configurando la variable FS
.,
por ejemplo, para establecer el separador de campo en .
usted usaría:
awk 'BEGIN { FS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0Raptors Toronto 58 24 076ers Philadelphia 51 31 0Celtics Boston 49 33 0Pacers Indiana 48 34 0
El separador de campo también se puede establecer en más de un carácter:
awk 'BEGIN { FS = ".." } { print $1 }' teams.txt
al ejecutar AWK one-liners en la línea de comandos, también puede usar la opción -F
para cambiar el separador de campos:
awk -F "." '{ print $1 }' teams.txt
por defecto, el separador de registros es un carácter de nueva línea y se puede cambiar usando el RS
variable.,
Aquí hay un ejemplo que muestra cómo cambiar el separador de registros a .
:
awk 'BEGIN { RS = "." } { print $1 }' teams.txt
Bucks Milwaukee 60 22 0732 Raptors Toronto 58 24 0707 76ers Philadelphia 51 31 0622Celtics Boston 49 33 0598Pacers Indiana 48 34 0585
acciones Awk #
Las acciones Awk están encerradas entre llaves ({}
) y se ejecuta cuando el patrón coincide. Una acción puede tener cero o más sentencias. Varias sentencias se ejecutan en el orden en que aparecen y deben estar separadas por una línea nueva o puntos y coma (;
).,
Hay varios tipos de sentencias de acción que son compatibles con las expresiones awk:
- , Como asignación de variables, operadores aritméticos, operadores de incremento y decremento.
- las sentencias de Control que se utilizan para controlar el flujo del programa (
if
,for
,while
,switch
, y más) - Salida de declaraciones, como
print
yprintf
. - declaraciones compuestas, para agrupar otras declaraciones.,
- instrucciones de entrada, para controlar el procesamiento de la entrada.
- instrucciones de eliminación, para eliminar elementos de matriz.
la instrucciónprint
es probablemente la instrucción awk más utilizada. Imprime una salida formateada de texto, registros, campos y variables.
al imprimir varios elementos, debe separarlos con comas., He aquí un ejemplo:
awk '{ print $1, $3, $5 }' teams.txt
El impreso elementos están separados por espacios únicos:
Bucks 60 0.732Raptors 58 0.70776ers 51 0.622Celtics 49 0.598Pacers 48 0.585
Si usted no utilice comas, no habrá espacio entre los objetos:
awk '{ print $1 $3 $5 }' teams.txt
Los elementos impresos están concatenados:
Bucks600.732Raptors580.70776ers510.622Celtics490.598Pacers480.585
Cuando print
se utiliza sin un argumento, el valor predeterminado es print $0
. Se imprime el registro actual.,
Para imprimir un texto personalizado, debe citar el texto con caracteres de comillas dobles:
awk '{ print "The first field:", $1}' teams.txt
The first field: BucksThe first field: RaptorsThe first field: 76ersThe first field: CelticsThe first field: Pacers
también puede imprimir caracteres especiales, tales como la nueva línea:
awk 'BEGIN { print "First line\nSecond line\nThird line" }'
First lineSecond lineThird line
El printf
declaración le da más control sobre el formato de salida., id=»aa8cfd3cbd»>
printf
no crea una nueva línea después de cada registro, por lo que estamos utilizando \n
:
1. Bucks Milwaukee 60 22 0.732 2. Raptors Toronto 58 24 0.707 3. 76ers Philadelphia 51 31 0.622 4. Celtics Boston 49 33 0.598 5. Pacers Indiana 48 34 0.585
el siguiente comando calcula la suma de los valores almacenados en el tercer campo en cada línea:
awk '{ sum += $3 } END { printf "%d\n", sum }' teams.txt
266
Aquí hay otro ejemplo que muestra cómo usar expresiones y sentencias de control para imprimir los cuadrados de números del 1 al 5:
awk 'BEGIN { i = 1; while (i < 6) { print "Square of", i, "is", i*i; ++i } }'
Square of 1 is 1Square of 2 is 4Square of 3 is 9Square of 4 is 16Square of 5 is 25
los comandos de una línea como el anterior son más difíciles de entender y mantener., Al escribir programas más largos, debe crear un archivo de programa separado:
BEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
Ejecute el programa por pasar el nombre de archivo para la etiqueta awk
intérprete:
awk -f prg.awk
también puede ejecutar un programa awk como un ejecutable mediante el proceso de la directiva y la configuración de la etiqueta awk
intérprete:
#!/usr/bin/awk -fBEGIN { i = 1 while (i < 6) { print "Square of", i, "is", i*i; ++i } }
guarde el archivo y hágalo ejecutable :
chmod +x prg.awk
ahora puede ejecutar el programa ingresando:
./prg.awk
usando Variables de Shell en programas Awk #
Si está utilizando el comando awk
en scripts de shell, lo más probable es que necesite pasar una variable de shell al programa AWK. Una opción es encerrar el programa con comillas dobles en lugar de simples y sustituir la variable en el programa., Sin embargo, esta opción hará que su programa awk sea más complejo, ya que necesitará escapar de las variables awk.
la forma recomendada de usar variables shell en programas awk es asignar la variable shell a una variable awk. Este es un ejemplo:
num=51
awk -v n="$num" 'BEGIN {print n}'