Professional Documents
Culture Documents
Introducción
El nombre awk proviene de las iniciales de sus desarrolladores : Alfred V. Aho, Brian W.
Kerningan y Peter J. Weinberger, de los Laboratorios Bell de AT&T. Inicialmente se
desarrolló para escribir programas muy cortos, pero las características de este atrajo a los
usuarios de tal modo, que lo impulsó más allá de la idea original de los autores. En 1985
apareció una nueva versión llamada nawk, en la que se implementan características nuevas
como son:
• Funciones de usuario.
• Expresiones regulares dinámicas con sustitución de texto.
• Mayor número de funciones intrínsecas y variables.
• Nuevos operadores y estamentos.
• Entrada de múltiples archivos.
• Acceso a argumentos en la línea de comandos.
• Mejora de los mensajes de error.
awk es un lenguaje de búsqueda y procesamiento de patrones. Esto quiere decir que awk es
capaz de buscar un patrón dentro de un archivo (al igual que grep) y tratarlo según unas
operaciones determinadas. Con awk se pueden desarrollar auténticos programas.
Según esto awk es capaz de procesar un archivo con datos organizados por columnas y
generar nuevas columnas con los valores resultantes de realizar ciertos cálculos u
operaciones.
A diferencia de comandos Unix como grep y sed, que filtran y procesan texto, awk
incorpora su propio lenguaje de programación, siendo capaz de ofrecer operaciones
aritméticas, relaciones lógicas y variables. Se pueden desarrollar programas con awk que
procesen la entrada estándar o un archivo, realizando tareas como tratar archivos de texto
como bases de datos. El lenguaje de programación awk incluye estamentos como for, while
e if-else, así como un conjunto de funciones y variables incorporadas.
Sintaxis
donde:
Campos y Variables
Una línea de entrada se divide en campos separados por espacios, y cada campo se
denomina como $1, $2, etc. $0 indica la línea entera. Estas variables se pueden manipular
(sumar, cambiar, etc.) como cualquier otra varible, por ejemplo:
Sumará los campos 2 y 3 en el campo 1, e imprimirá el nuevo registro (la línea completa).
Se pueden referir a los campos con expresiones numéricas como $i, $(n+1), $(NF*3/NR),
etc. Si la expresión resultante no es un entera, se truncará la parte decimal. El tratamiento
de un campo como texto o numérico dependerá del contexto, awk resuelve las posibles
ambigüedades tratando los campos como texto (por ejemplo cuando se compara un texto
con un número), por ejemplo:
En los programas de awk no es necesario declarar las variables (indicar el tipo de variable
de que se trata), se realizará automáticamente en función del contexto. Por defecto se
inicializan a la cadena nula o valor numérico 0, por lo que no es necesario inicializarlas.
Existen unas variables predefinidas, que pueden ser utilizadas dentro del programa:
Patrón { acción }
Interpretación:
Los patrones deben ir rodeados por caracteres "/", y puede contener dos patrones separados
por una coma, en cuyo caso la acción se realizará para aquellas líneas comprendidas entre
la primera aparición del primer patrón y la siguiente aparición del segundo patrón. Si se
utiliza el símbolo "~", indicará que el patrón de la derecha está contenido en el campo de la
izquierda, y si se utiliza "!~", indicará que no está contenido.
Existen dos etiquetas opcionales, con un significado especial, que hacen que un programa
awk tenga una estructura como la siguiente:
BEGIN { acción }
Patrón { acción }
END { acción }
Operaciones
Un programa awk puede hacer operaciones en coma flotante, utilizando los siguientes
operadores:
Funciones Incorporadas
Las siguientes funciones se pueden utilizar para la realización de operaciones aritméticas y
con cadenas de caracteres.
Función Descripción
length(x) Devuelve la longitud del argumento
sqrt(x) Devuelve la raíz cuadrada del argumento
log(x) Devuelve el logaritmo en neperiano del argumento (en base e)
exp(x) Devuelve el valor de e elevado al argumento
int(x) Devuelve la parte entera del argumento
cos(x) Devuelve el coseno del argumento
sin(x) Devuelve el seno del argumento
atan(x) Devuelve el arcotangente del argumento
rand() Devuelve un número aleatorio comprendido entre 0 y 1
Devuelve la posición de s en donde ocurre r, comenzando desde 1. Si no
match(s,r)
existe devuelve 0.
Devuelve la subcadena de s que comienza en la posición m y finaliza en
substr(s,m,n)
la n.
Sustituye la primera ocurrencia de t por r en la cadena s. Si no se
sub(r,t,s)
especifica s se tomará todo el registro ($0).
gsub(r,t,s) Igual que sub, pero sustituyendo todas las ocurrencias.
Divide la cadena s en array[1],...,array[n]. Se devuelve el número de
split(s,array,sep) elementos. Si no se especifica el separador en sep se utilizará el valor de
FS. s puede ser una variable.
Devuelve la posición de la cadena s1 en donde se encuentra la cadena s2.
index(s1,s2)
En caso de no encontrarse se devuelve 0.
Devuelve la cadena resultante de imprimir los valores e1, e2, ... con el
sprintf(f,e1,e2,...)
formato especificado en f.
toupper(s) Devuelve la cadena s convertida a mayúsculas.
tolower(s) Devuelve la cadena s convertida a minúsculas.
Ejecuta el comando UNIX cmd especificado y retorna el estado de salida
system(cmd)
de este.
print e1, e2, ... Presenta en la salida los valores e1, e2, ...
Presenta en la salida los valores e1, e2, ... con el formato especificado
printf f, e1, e2, ...
por f (al estilo C: %s, %d, etc.).
close(f) Cierra el archivo o pipe abierto con print, printf o getline.
Lee el siguiente registro de la entrada y se lo asigna a X, si no se
getline X
especifica X se asignará a $0.
Funciones
Las funciones se pueden definir (en la posición de un estamentopatrón-acción) del siguiente
modo:
Los parámetros se pasan por valor si son escalares y por referencia si se pasa el nombre del
array. Los parámetros son locales, mientras que el resto de las variables son globales. Las
funciones pueden llamarse de forma recursiva.
Ejemplos
Ejemplos de patrones
Ejemplos de acciones
Ejemplos
expresión { acción }
$ cat ejemplo.txt | awk '1'La bella y graciosa mozamarchóse a lavar la ropala frotó sobre
una piedray la colgó de un abedul. $ _
Esta plantilla contiene una expresión trivial (1), cuya evaluación resulta siempre positiva.
En ausencia de una acción asociada explícitamente, awk asume la acción por omisión, que
consiste en mostrar la línea completa en stdout. Se puede añadir una acción algo más
sofisticada entre llaves:
$ cat ejemplo.txt | awk '1 { print “Yo uso”; print “Linux” }'Yo usoLinuxYo
usoLinuxYo usoLinuxYo usoLinux$ _
9. Awk en acción
« Anterior | Inicio | Siguiente »
Para recapitular lo visto hasta ahora, se realizará a continuación algún proceso sencillo con
el archivo de ejemplo mostrado en párrafos anteriores. El archivo entrante contiene un
número teóricamente no determinado de registros, terminados por el carácter contenido en
RS. El proceso comienza leyendo el primer registro, aplicando a éste todas las plantillas
existentes con el valor de la variable NR igual a 1. Se reitera el proceso para cada registro,
incrementando en una unidad el valor de NR cada vez.
Cada registro está compuesto por NF campos, delimitados por las apariciones del carácter
FS en el mismo. El ordinal de cada campo se designa, como se indicó arriba, con $1, $2,
$3… y así hasta $NF.
Con campos, variables y operadores se puede escribir una plantilla algo más útil que las
anteriores:
$ awk '$5
“moza” { print “La linea”, NR, "contiene MOZA en el quinto campo”; }' ejemplo.txt
La línea 1 contiene MOZA en el quinto campo
$_
A medida que la lógica de las plantillas se complique, será de utilidad el parámetro –f
(minúscula) seguido del nombre del guión o script que contendrá las plantillas. Cuando las
plantillas se codifican dentro del script, no se usan las comillas simples para delimitarlas.
Un guión típico como el que se muestra (“proceso.awk” en el directorio actual) podría tener
el siguiente contenido:
La primera plantilla siempre se ejecuta por no tener expresión delante de las llaves. La
segunda solamente se activa para las líneas que tienen más de una palabra. La tercera es
aplicable si la línea comienza con la palabra “Linux”.