Sunteți pe pagina 1din 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]
ej.:

awk -f programa.awk

[archivo]
ej.:

Define una variable asignndole un valor dado.

variable="hola"

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

awk -F";" '/Badajoz/ {print $0}'

lineas.dat

Esquema general del programa:


Coleccin de clusulas
Patrn omitido
Accin omitida
Patrn /expr.regular/
Patrn expr. aritmt.

' /patrn/ { accin } ' ej. # awk '/cadena/ { print $1}'


se cumple siempre
ej.: # awk '{print $3}' fichero
{ print } (imprimir lnea)
debe ajustarse a la lnea
cumple si no nulo

Imprimir primeras N lneas: # awk 'NR < 10 {print}'

fichero

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
END

{ total = 0 }
{ total += $1}
{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" }' >
$ awk -f ejemplo1.awk

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

expresin

evaluacin de la expresin (la asignacin anterior es realmente


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
051943388
005428776
052970557
052375629
002550123
014301873
050100456
079309554
002915589
008928257

4.3
8
7.5
3
9.5
6
5.5
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:
Suspensos:
No presentados:
Total alumnos:

6
1
4
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
- Resta
* Multiplicacin
/ Divisin
% Mdulo (resto)
^ Potenciacin

var = expr Asignacin


var ++ Incrementa la variable en una unidad
var -- Decrementa la variable en una unidad
var += expr_aritm Incrementa la variable en cierta
cantidad
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


expr_aritm != expr_aritm Comparacin de desigualdad
expr_aritm < expr_aritm Comparacin menor que
expr_aritm > expr_aritm Comparacin mayor que
expr_aritm <= expr_aritm Comparacin menor igual que
expr_aritm >= expr_aritm Comparacin mayor igual que
expr_cad ~ expr_regular Se ajusta al patrn
expr_cad !~ expr_regular No se ajusta al patrn
expr_logica || expr_logica Operador lgico AND (Y)
expr_logica && expr_logica Operador lgico OR (O)
! expr_logica Operador lgico NOT (NO)

atan2( y, x) Retorna el arco-tangente de y/x en radianes


cos(x) Retorna el coseno de x en radianes
exp(x) Retorna el exponencial de x (e^x)
int(x) Retorna el valor entero de x truncado la parte
decimal
log(x) Retorna el logaritmo neperiano de x
rand() Retorna un valor seudo aleatorio comprendido
entre 0 y 1
sin(x) Retorna el seno de x en radianes
sqrt(x) Retorna la raiz cuadrada de x
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.

S-ar putea să vă placă și