Beruflich Dokumente
Kultur Dokumente
Clase 12: Introducción a AWK
Nombre unidad de aprendizaje: Programación avanzada de
SCRIPTS
Escuela de
Informática y Telecomunicaciones
2008 Escuela de Informática y Telecomunicaciones, DuocUC
Escuela de Informática y Telecomunicaciones
Objetivos
Objetivos de la clase
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 2
Escuela de Informática y Telecomunicaciones
Desarrollo
Introducción a AWK
AWK es un lenguaje de programación que permite
la búsqueda y procesamiento de patrones de texto
en archivos o flujos de datos.
AWK procesa patrones tal como lo hace GREP.
El nombre AWK deriva de los apellidos de los
autores del lenguaje: Alfred Aho, Peter
Weinberger y Brian Kernighan.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 3
Escuela de Informática y Telecomunicaciones
Desarrollo
Introducción a AWK
AWK hereda características (sintaxis) de los
lenguajes de shell scripting (como el BASH),
de programas como GREP y SED, y del
lenguaje C.
AWK incorpora su propio lenguaje de
programación, siendo capaz de ofrecer
operaciones aritméticas, relaciones lógicas,
manipulación de variables, control del flujo,
procesamiento de archivos, etc.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 4
Escuela de Informática y Telecomunicaciones
Desarrollo
Uso básico de AWK
La sintaxis de uso de AWK es:
awk [f prog_awk] [Fcaracter] [′programa′]
[variable=valor…] [archivo]
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 5
Escuela de Informática y Telecomunicaciones
Desarrollo
Uso básico de AWK
variable=valor se utiliza para establecer los
valores que tomarán las variables que utilizará
el programa.
archivo especifica el archivo que será
procesado por AWK; las instrucciones o
programas AWK de la orden actuarán sobre
este archivo.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 6
Escuela de Informática y Telecomunicaciones
Desarrollo
Uso básico de AWK
Veamos algunos ejemplos de uso de AWK:
Para imprimir en pantalla todas las líneas del
archivo arch que contengan la palabra “hola”.
[alumno@localhost ~]$ awk ′/hola/ {print $0}′ arch
Para mostrar en pantalla todas las líneas del
archivo arch de largo mayor que 10 (más de
10 caracteres).
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 7
Escuela de Informática y Telecomunicaciones
Desarrollo
Uso básico de AWK
[alumno@localhost ~]$ awk ′length > 10′ arch
[alumno@localhost ~]$ $awk F : ′{ print $2}′ arch
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 8
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
Podemos considerar que cada línea de un archivo
es un “registro”, que cada uno de estos
“registros” se compone de varios “campos”
delimitados (o separados) por algún caracter
delimitador, como por ejemplo un “*”, “:”, “#”, etc.
AWK usa $0 para identificar la línea completa del
archivo (registro), $1 para el primer campo, $2
para el segundo campo,…
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 9
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
Para imprimir en pantalla el campo 1 y el
campo 3 del archivo arch, que es un archivo
delimitado con “#”, usaremos: awk F # ′{print
$1”\t”$3} ′ arch.
Para imprimir todos los registros del archivo
arch cuyo apellido (campo 2) sea “Perez”,
usaremos: awk F # ′$2 == “Perez” {print $0}′
arch.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 10
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
Para imprimir en pantalla todos los registros del
archivo arch que contengan en el apellido
(campo 2 ) la palabra “var”, usaremos: awk F
# ′$2 ~ /var/ {print $0}′ arch.
“~” debe interpretarse como “contiene a” y “!~”
se interpreta como “no contiene a”.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 11
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
Veamos algunas variables predefinidas en
AWK relacionadas con archivos de registros:
FS – Separador de campos (Field Separator),
contiene el carácter que indica a AWK en qué
punto del registro acaba un campo y empieza
el siguiente. Por omisión es un espacio. Se
puede indicar un carácter alternativo mediante
una instrucción de asignación como BEGIN
{FS=“caracter”}.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 12
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
RS – Separador de registros (Record Separator),
contiene el carácter que indica a AWK en qué punto
del archivo acaba un registro y empieza el siguiente.
Es “\n” por omisión.
OFS – Separador de campos en la salida (Output
FS), contiene el separador de campos para la salida
generada por AWK. La instrucción print inserta en la
salida un carácter de separación cada vez que
aparece una coma en el código.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 13
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
ORS – Separador de registros en la salida
(Output RS), contiene el carácter que AWK
escribirá al final de cada registro. Es “\n” por
omisión.
NF – Número de campos de un registro
(Number of Fields), contiene el número total
de campos que contiene el registro que se está
leyendo en cada momento. También se usa
para nombrar el último campo.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 14
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
NR – contiene el número de orden del registro
que se está procesando en cada momento
(Number of Record).
A continuación veamos algunos ejemplos donde
se involucra el uso de estas variables:
Para imprimir las líneas o registros del archivo
arch, incluido el número del registro, usaremos:
awk –F # ′{print NR”\t”$0}′ arch.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 15
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
Para imprimir en pantalla los campos 1 y 2 del
archivo arch separados por un caracter de
tabulación (\t), usaremos: awk –F # v
OFS=“\t” ′{print $1,$2}′ arch.
Para imprimir las líneas impares del archivo
arch, usaremos: awk ′{if (NR%2==1) print
NR,$0}′ arch.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 16
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
Veamos algunos otros ejemplos de uso de AWK:
Para imprimir las líneas o registros del archivo
/etc/passwd, usaremos: awk F : ′{print $0}′ /etc/
passwd.
Para mostrar solo los registros de usuarios del
sistema en el archivo /etc/passwd, usaremos:
awk F : ′$3>=500 {print $0}′ /etc/passwd.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 17
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
AWK puede ser incluido en un “piping” como
cualquier otro comando o programa de LINUX,
veamos algunos ejemplos de esto:
Para imprimir en pantalla un listado de todos los
subdirectorios del directorio actual, usaremos: ls l ¦
awk ′/^d/ {print $1,” “,$9}′.
Para mostrar el nombre de usuario de todos los
usuarios “logueados” en la máquina, usaremos:
who ¦ awk '{print $1}‘.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 18
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
Podemos ejecutar ordenes SHELL por medio de
“piping” de comandos LINUX con AWK, por
ejemplo:
Para borrar todos los subdirectorios del directorio
actual, usaremos: ls l ¦ grep ^d ¦ awk ′{print “rm
rf “$9}′ ¦ bash.
Para borrar todos los subdirectorios del directorio
actual, ahora sin usar grep: ls l ¦ awk '$1~/^d.*x/
{print $9}' ¦ xargs rm r.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 19
Escuela de Informática y Telecomunicaciones
Desarrollo
Archivos de registros con AWK
Para borrar sólo los archivos del directorio actual,
usaremos: ls l * ¦ grep v drwx ¦ awk '{print "rm
"$9}' ¦ bash.
Para borrar sólo los archivos del directorio actual,
ahora sin usar grep: ls l ¦ awk '$1!~/^drwx/ {print
$9}' ¦ xargs rm.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 20
Escuela de Informática y Telecomunicaciones
Desarrollo
Procesamiento de registros con AWK
Las expresiones especiales, BEGIN y END,
permiten realizar acciones antes de procesar el
primer registro de un archivo, y después de
procesar el último registro de un archivo,
respectivamente.
Todo lo que se especifique en la sección de
BEGIN se ejecutará antes de procesar los
registros de un archivo.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 21
Escuela de Informática y Telecomunicaciones
Desarrollo
Procesamiento de registros con AWK
BEGIN se suele utilizar para inicializar
variables y mostrar mensajes.
Todo lo que se especifique en la sección de
END se ejecutará después de haber procesado
todos los registros de un archivo.
END habitualmente se emplea para obtener y
mostrar resultados finales tras operar con el
archivo de datos.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 22
Escuela de Informática y Telecomunicaciones
Desarrollo
Procesamiento de registros con AWK
Estas construcciones presentan la siguiente
sintaxis:
BEGIN {sentencias} Preprocesamiento
{sentencias} Procesamiento
END {sentencias} Postprocesamiento
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 23
Escuela de Informática y Telecomunicaciones
Desarrollo
Procesamiento de registros con AWK
Veamos un ejemplo, el sencillo script
“suma.awk” pone a cero la variable “total”
antes de iniciar el proceso del archivo de
entrada, añade a esa variable el valor
correspondiente al contenido del primer campo
de cada registro, y muestra el valor de la
variable al final:
BEGIN {total=0}
{total += $1}
END {print “Total=“,total}
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 24
Escuela de Informática y Telecomunicaciones
Desarrollo
Procesamiento de registros con AWK
Para ejecutarlo podríamos usar:
[alumno@localhost ~]$ echo e "10\n10\n10\n70" ¦ awk
f ./suma.awk
Total=100
Para contar y desplegar en pantalla la cantidad de
líneas y palabras de un archivo arch, usaremos el
script AWK “contar.awk”:
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 25
Escuela de Informática y Telecomunicaciones
Desarrollo
Procesamiento de registros con AWK
BEGIN {lines=0; words=0}
{
lines++;
words += NF;
}
END {print “Líneas=“,lines,” Palabras=“,words}
Para ejecutarlo podríamos usar:
[alumno@localhost ~]$ awk f ./contar.awk arch
Líneas=3 Palabras=12
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 26
Escuela de Informática y Telecomunicaciones
Desarrollo
Procesamiento de registros con AWK
Para contar el número de personas conectadas
en el sistema, usaremos: w ¦ awk 'BEGIN
{cont=0} NR>2 {cont=cont+1} END {print
cont}'.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 27
Escuela de Informática y Telecomunicaciones
Desarrollo
Expresiones regulares en AWK
Las EXPRESIONES REGULARES son útiles si
se necesita manipular o buscar en documentos
de texto.
Los metacaracteres proporcionan la
posibilidad de crear claves de búsqueda
bastante complejas.
En la siguiente tabla se especifican los meta
caracteres que pueden ser utilizados en un
EXPRESIÓN REGULAR de AWK:
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 28
Escuela de Informática y Telecomunicaciones
Desarrollo
Expresiones regulares en AWK
Expresión Significado
. Coincide con cualquier carácter.
^ Encuentra la expresión regular que le sigue, al principio
de una línea.
$ Encuentra la expresión regular que le sigue, al final de
una línea.
[ ] Coincide con cualquier caracter entre los corchetes.
[ad17] Coincide con los caracteres de un rango. En este caso:
todas las letras de a hasta d y todos lo dígitos de 1
hasta 7.
? Coincide con 0 ó 1 de la expresión que le precede.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 29
Escuela de Informática y Telecomunicaciones
Desarrollo
Expresiones regulares en AWK
Expresión Significado
* Coincide con 0 ó más de la expresión que le precede.
X|Z O X o Z.
XZ X seguido de Z.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 30
Escuela de Informática y Telecomunicaciones
Desarrollo
Expresiones regulares en AWK
De manera similar, el patrón !/pattern$/
encuentra todas las líneas donde el patrón no
se encuentre al final de la línea.
Veamos algunos ejemplos de uso de
EXPRESIONES REGULARES en AWK:
Para obtener el tamaño promedio de los
archivos del directorio actual, podemos usar:
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 31
Escuela de Informática y Telecomunicaciones
Desarrollo
Expresiones regulares en AWK
ls al ¦ awk ′BEGIN {total=0;count=0}
/^[^d]/ {total += $5; count++}
END {print total/count}′
Desarrollo
Expresiones regulares en AWK
Para quitar las líneas vacías del archivo arch,
podemos usar: awk ′!/^$/ { print }′ arch.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 33
Escuela de Informática y Telecomunicaciones
Desarrollo
Funciones implícitas de AWK
Las funciones implícitas (Builtin) son funciones
que están siempre disponibles para ser
llamadas por un programa AWK.
Cada función implícita acepta un cierto número
de argumentos. En la mayoría de los casos,
cualquier argumento extra que se le pase a la
función implícita es ignorado. Los valores por
defecto para argumentos omitidos varían de
una función a otra y son descritos en cada una
de las funciones.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 34
Escuela de Informática y Telecomunicaciones
Desarrollo
Funciones implícitas de AWK
Cuando se llama una función, las expresiones
que crean los parámetros actuales de la
función son evaluadas completamente antes
de realizarse la llamada a la función.
La siguiente es una completa lista de funciones
implícitas de AWK que trabajan con números:
int(x), sqrt(x), exp(x), log(x), sin(x), cos(x),
atan2(y,x), rand(), srand(x), time().
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 35
Escuela de Informática y Telecomunicaciones
Desarrollo
Funciones implícitas de AWK
Por ejemplo, para definir una función de
usuario que se pueda utilizar para obtener un
entero aleatorio no negativo menor que n,
usaremos:
function randint(n){
return int(n * rand())
}
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 36
Escuela de Informática y Telecomunicaciones
Resumen
Resumen de la clase
Ciertamente que AWK puede no ser tan potente como numerosas
herramientas que se pueden usar con la misma finalidad. Pero tiene la
enorme ventaja de que, en un tiempo realmente corto, permite escribir
programas que, aunque tal vez sean de un solo uso, están totalmente
adaptados a nuestras necesidades, que en muchas ocasiones son
sumamente sencillas.
AWK es ideal para los propósitos con los que se diseño: leer ficheros
línea por línea y procesar en base a los patrones y cadenas que
encuentre en ellas.
Archivos del sistema como el /etc/password y muchos otros, resultan
sumamente fáciles de tratar mediante el AWK, sin recurrir a nada más.
Y desde luego que AWKno es el mejor. Hay varios lenguajes de scripting
con capacidades mucho mayores. Pero AWK sigue teniendo la ventaja de
ser siempre accesible en cualquier instalación, por mínima que esta sea.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 37