You are on page 1of 7

AWK Resumen Introduccin a la herramienta de programacin AWK por JD Portalo /ISO-1ASIR

"AWK es un lenguaje de programacin especializado en anlisis y procesamiento de patrones de texto'

Origen de las siglas AWK: Aho, Weinberger y Kernighan

Sintxis:

awk [-f archivo_programa][-F"caracter"]['programa'][var=valor...][archivo]

ejemplo:
awk -F":" '/root/ {print $1}' /etc/passwd
awk -F";" '/[^A-Za-z]/ {print $0}' lineas.dat (comienzan por una letra)

Explicacin:

[-f archivo_programa] especifica un archivo fuente (script) con los comandos del programa a aplicar.

ej.: -f contar.awk

[-F"caracter"] especifica el carcter que separa cada campo en una lnea. Aqu es ";"

ej.: -F";"

['programa'] especifica el conjunto de patrones o instrucciones que se aplicarn al archivo. A


diferencia con el archivo_programa en este caso se especifican los patrones e instrucciones en la misma lnea de
comandos. Los patrones e instrucciones han de ir encerrados entre comillas simples ('). Las instrucciones van
encerradas dentro de llaves { }.

ej.: '/root/ {print $0}'

[var=valor] Define una variable asignndole un valor dado.

ej.: awk -f programa.awk variable="hola"

[archivo] Especifica el archivo de entrada que ser procesado por 'awk', ej. lineas.dat:

ej.: awk -F";" '/Badajoz/ {print $0}' lineas.dat

Esquema general del programa:

Coleccin de clusulas ' /patrn/ { accin } ' ej. # awk '/cadena/ { print $1}' fichero
Patrn omitido se cumple siempre ej.: # awk '{print $3}' fichero
Accin omitida { print } (imprimir lnea)
Patrn /expr.regular/ debe ajustarse a la lnea
Patrn expr. aritmt. cumple si no nulo
Imprimir primeras N lneas: # awk 'NR < 10 {print}'
Uso de variables:

$0 : se refiere a la lnea entera


$1 : se refiere al primer campo/columna (campos separados por espacio o por carcter separador (F":")
$2 : se refiere al segundo campo ... $n : se refiere al campo n

ej.: Mostrar el nombre de usuario ($1) y su UID ($3) del fichero de usuarios:

awk -F":" '{print $1, $3}' /etc/passwd

Estructura de un programa awk


Patrones especiales. Partes del programa: BEGIN/ END

Un programa awk tiene tres secciones:

1. Parte inicial, que se ejecuta slo una vez, antes de empezar a procesar la entrada:

BEGIN { operaciones }

2. Parte central, con instrucciones que se ejecutan para cada una de las lneas de la entrada; tienen en
siguiente formato:

/PATRN/ { operaciones }

las operaciones se realizan slo sobre las lneas que verifiquen la REGEXP indicada en PATRN

o si ponemos !/PATRN/ las operaciones se ejecutan en las lneas que no concuerden con el patrn
3. Parte final, se efecta slo una vez, despus de procesar la entrada:

END { operaciones }

BEGIN { total = 0 }
{ total += $1}
END {print "El total es: ", total }

Ejecucin de un programa AWK


Leer los ficheros de entrada lnea por lnea y aplicar a cada lnea la coleccin de clusulas, por su orden.
AWK Ejemplos:

1. Creamos el fichero: datos.emp : (nombre, sueldoxhora, horas trabajadas)


Juan,20,0
Luis,15,0
Maria,25,20
Ana,20,16
Pedro,30,15

Ej. 1.1: Mostrar nombre de usuario y horas trabajadas: # awk F, {print $1,$3} datos.emp
Explicacin:
-F"," : especifica que los campos en cada lnea estn separados por comas
'{print $1, $3}' es el programa a ejecutar: muestra los campos primero ($1) y tercero ($3)
datos.emp es el fichero de entrada. Cada lnea leda ser procesada y mostrar $1 y $3

Ej. 1.2: Mostrar nombre de usuario que ha trabajado : # awk F, $3 > 0 {print $1} datos.emp
Explicacin:
$3 > 0 es la condicin que se ha de cumplir para ejecutar la parte del programa.

Ej. 1.3: Mostrar nombre de usuario y sueldo : # awk F, {print $1, $2 * $3} datos.emp

2. Uso de archivos de programa:

$ echo '{ print "Hola mundo" }' > ejemplo1.awk


$ awk -f ejemplo1.awk

Otro ejemplo con patrones BEGIN/END. Creamos el archivo calculo.awk:

# Script de ejemplo para clculo del total y de la media de pagos a empleados


# Autor: juande
BEGIN {
print Comenzamos
total = 0
}
#Cuerpo principal del programa (se ejecuta por cada lnea en el archivo de entrada):
{ total = total + $2 * $3}
#bloque final
END {
media = total /NR
print cantidad total : total
print paga media : media
print ** Fin de Programa**
}

Llamada : # awk -F, -f calculo.awk

NR Palabra reservada que muestra el nmero de orden de lnea del fichero a procesar ( ej. {print NR, $0} )
Otras palabras reservadas:

FS Field Separator (Espacio o TAB por defecto)


NF Nmero de campos (elds) en la lnea actual
NR Nmero de orden de lnea del fichero a procesar. ( ej. {print NR, $0} )
OFS Output Field Separator ( ).
ORS Output Record Separator (\n).
RS Input Record Separator (\n).
etc...

Estructuras bsicas de programacin:

Estructura "If-else ..."


{ print "Leyendo registro nro.:", NR;
if ($1 > 5)
{print $1 "es mayor que 5"}
else
{print $1 "es menor o igual que 5"}
}

Operadores de comparacin: ==, !=, <, >, <=, >=,

Estructura "for ..."

{ for ( c = 0; c < 10; c ++ )


{
print c;
}
}

Sentencia Significado

var = expresin asignacin de valor a una variable

evaluacin de la expresin (la asignacin anterior es realmente


expresin un caso particular de expresin, usando el operador de
asignacin)

if (condicin) accin accin condicional

if (condicin) accin else accin acciones alternativas

while (condicin) accin bucle WHILE

for (k=ini; k<=fin; k++) accin-con-k bucle FOR (como en C)

{ sentencia; sentencia ... } accin compuesta

print expresin, expresin ... imprime valores separados por espacio en blanco
Ejemplo: recuento de notas

Para dar una idea rpida de cmo es un programa en AWK, a continuacin se presenta como
ejemplo el proceso de una lista de calificaciones de un examen para obtener un resumen
estadstico simple. El significado de los elementos que aparecen en el programa se ir viendo en
los siguientes apartados.

Fichero de datos - notas de un examen ( DNI del alumno y nota numrica):

051422949 4.3
051943388 8
005428776 7.5
052970557
052375629 3
002550123 9.5
014301873
050100456 6
079309554 5.5
002915589
008928257 8.7

Programa - recuento de aprobados y suspensos:

$1 {alumnos++}

$2 >= 5 {aprobados++}

NF==1 {nopresentados++}

END {
suspensos = alumnos - aprobados - nopresentados
print "Aprobados: ", aprobados
print "Suspensos: ", suspensos
print "No presentados:", nopresentados
print "Total alumnos: ", alumnos
}

Resultados:

Aprobados: 6
Suspensos: 1
No presentados: 4
Total alumnos: 11
Las funciones utilizables en las condiciones y comandos son, entre otras:

close(fichero_a_reiniciar_desde_cero)
cos(x), sin(x)
index()
int(num)
lenght(string)
substr(str,pos,len)
tolower()
toupper()
system(orden_del_sistema_a_ejecutar)
printf()
Los operadores soportados por awk son los siguientes:

*, /, %, +, -, =, ++, --, +=, -=, *=, /=, %=.

El control de flujo soportado por AWK incluye:

if ( expr ) statement
if ( expr ) statement else statement
while ( expr ) statement
do statement while ( expr )
for ( opt_expr ; opt_expr ; opt_expr ) statement
for ( var in array ) statement
continue, break
(condicion)? a : b if(condicion) a else b;
Las operaciones de bsqueda son las siguientes:

/cadena/ Bsqueda de cadena.


/^cadena/ Bsqueda de cadena al principio de la lnea.
/cadena$/ Bsqueda de cadena al final de la lnea.
$N ~ /cadena/ Bsqueda de cadena en el campo N.
$N !~ /cadena/ Bsqueda de cadena NO en el campo N.
/(cadena1)|(cadena2)/ Bsqueda de cadena1 OR cadena2.
/cadena1/,/cadena2>/ Todas las lneas entre cadena1 y cadena2.

Generar 40 nmeros aleatorios slo con awk:


# awk 'BEGIN { for (i = 1; i <= 40; i++) print int(101 * rand()) }'
Algunas expresiones parecen inspiradas en el lenguaje C. Otras parece que han servido de inspiracin para el
lenguaje Perl. En realidad muchos lenguajes usan expresiones parecidas.
Vamos a resumir una serie de elementos que intervienen en las expresiones que 'awk' es capaz de manejar.

Operadores aritmticos Operadores de asignacin.

+ Suma var = expr Asignacin


- Resta var ++ Incrementa la variable en una unidad
* Multiplicacin var -- Decrementa la variable en una unidad
/ Divisin var += expr_aritm Incrementa la variable en cierta
% Mdulo (resto) cantidad
^ Potenciacin var -= expr_aritm Decrementa la variable en cierta
cantidad
var *= expr_aritm Multiplica la variable por cierta
cantidad
var /= expr_aritm Divide la variable por cierta cantidad
var %= expr_aritm Guarda en la variable el resto de su
divisin por cierta cantidad
var ^= expr_aritm Eleva el valor de la variable en cierta
cantidad

Operadores lgicos y de relacin. Funciones aritmticas.

expr_aritm == expr_aritm Comparacin de igualdad atan2( y, x) Retorna el arco-tangente de y/x en radianes


expr_aritm != expr_aritm Comparacin de desigualdad cos(x) Retorna el coseno de x en radianes
expr_aritm < expr_aritm Comparacin menor que exp(x) Retorna el exponencial de x (e^x)
expr_aritm > expr_aritm Comparacin mayor que int(x) Retorna el valor entero de x truncado la parte
expr_aritm <= expr_aritm Comparacin menor igual que decimal
expr_aritm >= expr_aritm Comparacin mayor igual que log(x) Retorna el logaritmo neperiano de x
expr_cad ~ expr_regular Se ajusta al patrn rand() Retorna un valor seudo aleatorio comprendido
expr_cad !~ expr_regular No se ajusta al patrn entre 0 y 1
expr_logica || expr_logica Operador lgico AND (Y) sin(x) Retorna el seno de x en radianes
expr_logica && expr_logica Operador lgico OR (O) sqrt(x) Retorna la raiz cuadrada de x
! expr_logica Operador lgico NOT (NO) srand(x) Inicializa la semilla para generar nmeros
pseudoaleatorios

Funciones para usar con cadenas de caracteres


gsub(r, s, t) Sustituye 's' globalmente en todo 't' cada vez que se encuentre unpatrn ajustado a la expresin regular
'r'. Si no se proporciona 't'se toma $0 por defecto. Devuelve el nmero de sustituciones realizado.
index(cadena, subcadena) Retorna la posicin de la 'subcadena' en 'cadena' (Primera posicin = 1)
length(cadena) Devuelve la longitud de la 'cadena'. Tomar $0 por defecto si no seproporciona 'cadena'
split(cadena, array, sep) Parte 'cadena' en elementos de 'array' utilizando 'sep' como separador. Si no se
proporciona 'sep' se usar FS. Devuelve el nmero de elementos del array
sub(r, s, t) Sustituye 's' en 't' la primera vez que se encuentre un patrnajustado a la expresin regular 'r'. Si no se
proporciona 't' se toma $0por defecto.Devuelve 1 si tiene xito y 0 si falla.
substr(cadena, beg, len) Devuelve una subcadena de 'cadena' que empieza en 'beg' con una longitud 'len'. Si no se
proporciona longitud devuelve hasta el final de la cadenadesde 'beg'
tolower(cadena) Pasa a minsculas
toupper(cadena) Pasa a maysculas

Algunas otras funciones


match(cadena, expr_reg) Indica si 'cadena' se ajusta o no a la expresin regular 'expr_reg'
system(comando)
sprintf(formato [, expr-list] ) Para obtener salida con formato.

You might also like