Anda di halaman 1dari 12

Herramientas Grep y AWK

Asignatura: Entornos de programacin

Expresiones regulares
Herramientas Grep y AWK
En este tema se introducen las expresiones regulares y un par de utilidades que las usan
de manera intensiva: 'grep' y 'awk'. Estas utilidades proceden del mundo UNIX, y estn
disponibles hoy da en todas las plataformas usadas habitualmente.
Grep: Su nombre se toma de la expresin "Globally search for Regular Expression
and Print", que describe una de las funciones disponibles en el editor "ed" de UNIX.
Dicha funcin aparece documentada en el manual como g/re/ p. La funcin
principal de la utilidad "grep" es extraer de un fichero de texto las lneas que cumplen
con un patrn dado por una expresin regular.
AWK: Su nombre se obtiene de las iniciales de los apellidos de sus autores: Alfred
Aho, Peter Weinberger y Brian Kernighan. El nombre se aplica a un lenguaje de
script (AWK) y al procesador que lo interpreta (awk). Est orientado al proceso de
ficheros de texto que contienen uno o varios campos de datos en cada lnea. Usa
expresiones regulares para seleccionar las lneas de texto deseadas, y las acciones a
realizar se escriben como en lenguaje C.

1. Expresiones regulares
Las expresiones regulares permiten describir estructuras sintcticas, en particular las de
los lenguajes regulares. Son, por tanto, patrones sintcticos a los que deben ajustarse los
elementos que componen el vocabulario del lenguaje.
Dicho de una manera ms sencilla, las expresiones regulares son patrones que permiten
reconocer secuencias de smbolos con una estructura sintctica determinada.
Hay diversas notaciones para representar expresiones regulares. Por ejemplo, la notacin
BNF y otras derivadas de ella. Los comodines (wildcards) usados para designar conjuntos
de ficheros vienen a ser una forma restringida de rexpresiones regulares.
La notacin que se describe aqu permite escribir patrones para secuencias de caracteres
(strings), y corresponde a la que con ligeras variantes se usa en diversas utilidades para
proceso de textos: "grep", "awk", "perl", la librera "regexp", etc. Los apartados siguientes
describen los elementos principales. Para una descripcin ms completa se debe consultar
el manual de referencia correspondiente.

1.1 Expresiones simples


Son patrones que se ajustan a un nico smbolo (en general, a un nico carcter):
Expresin

Significado

carcter x, si es carcter normal

cualquier carcter

[aeiou]

un carcter del conjunto

Expresiones regulares - Herramientas Grep y AWK - 1

Herramientas Grep y AWK


[a-z]

un carcter del rango

[^aeiou0-9]

complementa el conjunto

\x

carcter x, si x es un carcter especial

principio del texto, si va al comienzo

fin del texto, si va al final

\<

principio de palabra (*)

\>

fin de palabra (*)

(*) Patrn no estndar

1.2 Expresiones compuestas


Son patrones que combinan expresiones simples. Se ajustan a una secuencia de smbolos.
Expresin

Significado

xy

expresin x seguida de y

x+

una o ms repeticiones de x

x*

cero o ms repeticiones de x

x?

cero o una aparicin de x

una|otra

una u otra expresin

(x)

expresin x

1.3 Ejemplos de expresiones regulares


Un dgito numrico, decimal: [0-9]
Una vocal: [AEIOUaeiou]
Una letra, mayscula o minscula: [A-Za-z]
Una palabra que empieza por letra y puede contener nmeros: [A-Za-z][A-Zaz0-9]*
Un nmero, con punto decimal, al comienzo del texto: ^[+\-0-9][0-9]*\.
[0-9]*
Abreviatura del nombre de un mes: (Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|
Sep|Oct|Nov|Dic)

Expresiones regulares - Herramientas Grep y AWK - 2

Herramientas Grep y AWK

2. Herramienta Grep
Es un programa de utilidad que permite seleccionar las lneas de un texto que cumplen con
un patrn determinado. La orden para invocarla es:
> grep patrn ficheros...
El patrn se escribe como una expresin regular. Los nombres de los ficheros de entrada
pueden incluir comodines. El programa lee los ficheros y copia a la salida cada lnea que
se ajuste al patrn.
La utilidad grep procede de UNIX. Dispone de parmetros opcionales para controlar su
funcionamiento. Para conocer las posibles opciones se puede invocar como:
> grep --help
> grep -h
> grep
Ejemplo: extraer todas las lneas de cdigo C/C++ que empiecen con un comentario (// o
/*) desde la primera posicin.
> grep ^/[/\*] *.h *.c *.cpp

Expresiones regulares - Herramientas Grep y AWK - 3

Herramientas Grep y AWK

3. Lenguaje AWK
AWK es un lenguaje para procesar ficheros de texto, lnea a lnea. Resulta apropiado para
extraer datos individuales, realizar recuentos, modificar el formato de los datos, generar
resmenes, etc. La potencia del lenguaje reside en el uso extensivo de expresiones
regulares para seleccionar los fragmentos de informacin apropiados, y la posibilidad de
combinar los estilos de programacin declarativo e imperativo.
En realidad existen distintas variantes de AWK, dependiendo del procesador utilizado:
awk - lenguaje original
awk - POSIX
nawk - AWK renovado
gawk - AWK de GNU
mawk - Mike's AWK
tawk - AWK de Thompson Automation
...etc. ...
En los ejemplos se usar gawk.

3.1 Elementos bsicos


Un programa consiste en una coleccin de clusulas o reglas, cada una de las cuales
sigue el esquema:
patrn { accin }
Cada clusula indica que si se cumple el patrn se debe realizar la correspondiente
accin.
El patrn puede omitirse. Es este caso es como si hubiera un patrn que se cumple
siempre.
La accin puede omitirse. En este caso es como si hubiera una accin {print}
(imprimir lnea).
La ejecucin de un programa AWK consiste en leer los ficheros de entrada lnea por
lnea y aplicar a cada lnea la coleccin de clusulas, por su orden.
Los datos pueden ser valores numricos o de texto, y se convierten automticamente
de un formato a otro cuando sea necesario.
El patrn puede ser una expresin regular. Se cumple si la lnea de datos se ajusta a
dicho patrn.
El patrn puede ser tambin una expresin. El patrn se cumple si el valor resultante
(nmero o texto) no es cero o nulo (0 o "")
Las acciones se escriben como en lenguaje C
No hay que declarar las variables (se crean al usarlas por primera vez, con valores
nulos)
Los valores literales de texto se escriben como en C, entre comillas dobles:
"texto". Pueden incluir secuencias de escape (\n \t \\ ...).

Expresiones regulares - Herramientas Grep y AWK - 4

Herramientas Grep y AWK


Las funciones se invocan como funcin(argumentos).
El texto de un programa puede incluir comentarios, empezando con el carcter # y
hasta el final de la lnea.

3.2 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
2
3
11

Expresiones regulares - Herramientas Grep y AWK - 5

Herramientas Grep y AWK

3.3 Patrones
En AWK hay varias clases de patrones. Todos ellos funcionan como condiciones con un
resultado booleano.
Expresiones regulares. Se escriben como /expresin/, entre barras. La condicin
se cumple si la lnea de datos de entrada se ajusta a esa expresin regular.
Expresiones aritmticas (o de texto). Se escriben prcticamente igual que en lenguaje
C. La condicin se cumple si el resultado de evaluar la expresin es un valor de texto
no nulo o un valor numrico distinto de cero.
Patrones especiales. Algunos de ellos son:
o

La palabra clave BEGIN. La condicin se cumple al principio del programa, antes


de leer los datos de entrada.

La palabra clave END. La condicin se cumple al final de todo el proceso,


despus de procesar todos los datos de entrada y justo antes de terminar

Un par de patrones separados por una coma, de la forma x,y. Se denomina


patrn compuesto o rango. La condicin se cumple para una secuencia
correlativa de lneas de entrada desde una que cumpla el primer patrn x hasta
la siguiente que cumpla el segundo patrn y, ambas inclusive.

3.4 Operadores
Como se ha dicho, son similares a los del lenguaje C. Los ms importantes son:
Operadores aritmticos: + - * / % ^
Operadores de comparacin: == != > >= < <=
Operadores de asignacin: = += -= *= /=
Operadores de incremento o decremento, en sus formas prefija y postfija: ++ - Operadores lgicos: ! && ||
Operador de ajuste de patrn: ~
La operacin de concatenacin usa un operador implcito: "uno" "dos"
"unodos"
Tambin existe la expresin condicional: x ? y : z
Los valores numricos y de texto son convertidos automticamente de un tipo a otro cuando
sea necesario. Cuando se quiera forzar una conversin se puede escribir:
x + 0 valor de x convertido a tipo numrico
x "" valor de x convertido a texto

3.5 Funciones predefinidas


Entre otras, las siguientes:
Funciones matemticas (numricas): sqrt(), sin(), cos(), exp(), ...
Funciones de texto: length(), substr(), index(), toupper(), tolower(),
gsub(), match(), ...

Expresiones regulares - Herramientas Grep y AWK - 6

Herramientas Grep y AWK


Otras funciones: system(), getline, systime(), ...

3.6 Campos en las lneas de entrada


Cada lnea de texto de la entrada se descompone automticamente en campos. Por defecto,
los campos se separan por espacio en blanco. Los campos pueden referenciarse por
separado, mediante el operador $.
$n n-simo campo
$0 toda la lnea
$expresin la referencia a un campo puede ser calculada
Ejemplo:
$0 = "ejemplo de lnea de texto"
$1 = "ejemplo"
$2 = "de"
$3 = "lnea"
$4 = "de"
$5 = "texto"
k = 3 $k = "lnea"

3.7 Variables simples


Una variable simple puede contener un valor numrico o de texto. Las variables no se
declaran, simo que empiezan a existir cuando se usan por primera vez. Inicialmente tienen
valor nulo.

3.8 Variables simples predefinidas


Existen variables predefinidas que sirven de comunicacin entre el cdigo del usuario y el
propio intrprete de AWK. Entre otras las siguientes:
NF nmero de campos
NR nmero de la lnea (global, aunque haya varios ficheros de entrada)
FNR nmero de la lnea (local al fichero)
FILENAME nombre del fichero actual
Las variables anteriores toman valor automticamente con cada lnea. Otras variables son
asignadas por el usuario para controlar el funcionamiento del intrprete. Por ejemplo:
FS separador de campos de entrada (por defecto " ")
RS separador de lneas de entrada (por defecto "\n")
OFS separador de campos en la salida (por defecto " ")
ORS separador de lneas en la salida (por defecto "\n")

Expresiones regulares - Herramientas Grep y AWK - 7

Herramientas Grep y AWK

3.9 Acciones
Las acciones son sentencias o secuencias de sentencias que se escriben como en lenguaje
C. El cdigo de una sentencia termina implcitamente con el fin de lnea o explcitamente
con punto y coma (;). Algunas sentencias de uso frecuente son:
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- bucle FOR (como en C)


con-k
{ sentencia; sentencia ... }

accin compuesta

print expresin, expresin ...

imprime valores separados por espacio en


blanco

print

equivale a print $0

printf( formato, expresin,


expresin ... )

impresin con formato (como en C)

print ... > fichero

redirige la salida al fichero

getline variable < fichero

lee explcitamente una lnea de un fichero

close( fichero )

libera el fichero

next

termina el proceso de la lnea de entrada


actual

exit

termina la lectura de la entrada y da


control a las acciones END (o bien termina
definitivamente)

3.10 Vectores o tablas (arrays)


La nica estructura de datos que existe en AWK son los vectores o tablas (en ingls array).
Tambin se les llama vectores asociativos. Tienen las siguientes caractersticas
Son una coleccin de pares: (clave, informacin)
Se usa la notacin de array de C: tabla[clave] informacin
Las claves admiten valores de cualquier tipo (nmeros o texto)

Expresiones regulares - Herramientas Grep y AWK - 8

Herramientas Grep y AWK


Las tablas no se declaran. Los elementos empiezan a existir la primera vez que se
hace referencia a cada uno
Para eliminar un elemento no basta asignarle valor nulo, sino que hay que destruirlo
explcitamente: delete tabla[clave]
La tabla completa puede destruirse mediante: delete tabla
Para consultar si existe un elemento dado se escribe: clave in tabla
Hay una variante del bucle FOR que permite recorrer una tabla:
for (clave in tabla) accin-con-clave

3.11 Vectores (arrays) predefinidos


Existen algunos vectores predefinidos que permiten acceder a informacin del ambiente de
ejecucin:
ARGV[0..ARGC-1] argumentos de llamada a "awk" (lista de ficheros, no las opciones o -switches)
ENVIRON[nombre] valor de una variable de entorno

3.12 Vectores con varios ndices (seudomatrices)


Se pueden simular estructuras matriciales de dos o ms dimensiones refundiendo varios
ndices en uno solo. Existe una variable predefinida SUBSEP cuyo contenido se usa
implcitamente como delimitador:
matriz[x,y] = valor registra el valor en el elemento
matriz[x SUBSEP y]
if ((x, y) in matriz) ... consulta si existe el elemento matriz[x,y]
for (xy in matriz) ... split(xy, indice, SUBSEP) ... separa los
ndices en indice[1] e indice[2]

3.13 Funciones definidas por el usuario


Adems de las funciones predefinidas el usuario puede definir sus propias funciones. La
definicin de una funcin tiene el mismo aspecto que una clusula o regla del programa,
usando un patrn especial que empieza con la palabra clave function.
function nombre( argumento, argumento, ...) { accin-conargumentos }
no debe haber espacio en blanco entre el nombre y el parentesis
el valor de la funcin se devuelve con la sentencia: return valor
en el cdigo de la accin, los nombres de variables que no sean argumentos se
interpretan como variables globales
para tener variables locales se usa el artificio de aadir argumentos adicionales, no
usados en la llamada
o

function nombre( arg1, arg2,

se invoca como: nombre( valor1, valor2 )

aux1, aux2 )

Expresiones regulares - Herramientas Grep y AWK - 9

Herramientas Grep y AWK

3.14 Invocar un programa AWK


Los programas en AWK se ejecutan bajo intrprete. Por lo tanto para usar un programa hay
que invocar el intrprete correspondiente, indicando cul es el programa AWK a ejecutar y
cules son los ficheros de datos de entrada. El formato de la orden es uno de los siguientes:
> gawk
> gawk

"programa" fichero fichero ...


-f programa fichero fichero ...

El primer caso slo es til para programas muy cortos. El texto del programa se escribe
literalmente, entre comillas, en la propia orden, antes de los nombres de los ficheros de
entrada. En el segundo caso el programa se almacena en un fichero de texto y el nombre
de dicho fichero se indica con la opcin -f. La orden puede incluir tambin una asignacin
de valores iniciales a ciertas variables del programa, con la opcin -v:
> gawk

... -v variable=valor ...

El siguiente ejemplo usa "awk" para emular el funcionamiento de la herramienta "grep":


> gawk

"/^[0-9]/" *.txt

Esta orden imprime (accin por defecto) cada lnea que empiece (^) por un carcter
numrico (0-9) en cualquier fichero de texto (*.txt) que haya en el directorio actual.
El nombre de la orden debe corresponderse con el intrprete concreto que se utilice. Hay
distintos intrpretes para distintas variantes de AWK: awk, nawk, mawk, gawk, tawk, etc.

Expresiones regulares - Herramientas Grep y AWK - 10

Herramientas Grep y AWK

4. Ejemplo: vocabulario usado en un texto


Este programa imprime la lista de todas las palabras diferentes usadas en un texto, junto
con la frecuencia de aparicin de cada una. Para simplificar el programa se asume que no
hay signos de puntuacin, y las palabras estn separadas por espacio en blanco o saltos
de lnea. Esto significa que cada palabra es un campo de la lnea de entrada.
Cdigo del programa (vocabulario.awk):
{
for (k=1; k<=NF; k++) {
cuenta[$k]++
}
}
END {
for (pal in cuenta) {
print pal, cuenta[pal]
}
}
Observaciones:
1. La primera clusula del programa tiene el patrn omitido. Se aplica a todas las lneas
del texto de entrada.
2. Las palabras en maysculas y en minsculas se tratan como diferentes. Este es el
comportamiento por defecto de AWK.
3. Los resultados no aparecen en orden alfabtico (ni en ningn otro orden
determinado). Las tablas suelen implementarse internamente como tablas "hash",
y sus elementos se recorren en el orden que haya decidido quien construy el
intrprete.
Ejemplo de texto de entrada (texto.txt):
Este programa imprime la lista de todas las
palabras diferentes usadas en un texto, junto con
la frecuencia de aparicin de cada una. Para
simplificar el programa se asume que no hay
signos de puntuacin, y las palabras estn
separadas por espacio en blanco o saltos de
lnea. Esto significa que cada palabra es un
campo de la lnea de entrada.
Orden de ejecucin:
> gawk -f vocabulario.awk texto.txt
Resultados:
entrada. 1
Esto 1
no 1

Expresiones regulares - Herramientas Grep y AWK - 11

Herramientas Grep y AWK


frecuencia 1
palabra 1
el 1
con 1
palabras 2
todas 1
lista 1
imprime 1
programa 2
lnea 1
Para 1
campo 1
que 2
... etc. ...

Expresiones regulares - Herramientas Grep y AWK - 12

Anda mungkin juga menyukai