Padsemana 12

Descargar como pdf
Descargar como pdf
Está en la página 1de 39

Programación Aplicada

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

 Construye rutinas scripting para el análisis de


LOG.
 Construye rutinas scripting Web de monitoreo
de proceso y eventos.

© 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
 La versión original de AWK fue escrita en 1977
en los laboratorios de AT&T. En 1985 una
nueva versión hizo al lenguaje de
programación AWK más potente, introduciendo
algunas nuevas características.
 La implementación GNU de AWK, llamada
GAWK, fue escrita en 1986 por Paul Rubin y
Jay Fenlason, con consejos de Richard
Stallman. John Woods también participó del
desarrollo de GAWK.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 4
Escuela de Informática y Telecomunicaciones

Desarrollo
Introducción a AWK
 En 1988 y 1989, David Trueman junto con
Arnold Robbins, introdujeron los cambios
necesarios para hacer GAWK compatible con
el nuevo AWK.
 GAWK es también compatible con la
especificación POSIX del lenguaje AWK.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 5
Escuela de Informática y Telecomunicaciones

Desarrollo
Introducción a AWK
 AWK hereda características sintácticas 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, entre otras
posibilidades.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 6
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]

 prog_awk especifica el nombre de un


programa escrito en AWK.
 caracter especifica un caracter para ser usado
como delimitador de campo del archivo.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 7
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 8
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 9
Escuela de Informática y Telecomunicaciones

Desarrollo
Uso básico de AWK

[alumno@localhost ~]$ awk ′length > 10′ arch

 Para imprimir en pantalla el segundo campo


del archivo arch, suponiendo que arch es un
archivo con campos delimitados por “:”.

[alumno@localhost ~]$ awk -F : ′{ print $2}′ arch

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 10
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 11
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 12
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 13
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 14
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 15
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 16
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 17
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 18
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 19
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 los nombres de login de todos los
usuarios “logueados” en la máquina, usaremos:
who ¦ awk '{print $1}„.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 20
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 21
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 22
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 23
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 24
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 25
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 26
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 27
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 28
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 29
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 meta-caracteres 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 30
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.
[a-d1-7] 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 31
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.

 Se puede utilizar !/^…/ para asegurarnos que


una línea no “parte” con el patrón dado, como
en !/^S/ para encontrar alguna línea que no
“parta” con una “S”.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 32
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 33
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}′

 Notar que la expresión regular o patrón es


/^[^d]/ donde el primer ^ indica “coincidencia
al principio de la línea” y el [^d] indica
“cualquier cosa que no sea una d”.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 34
Escuela de Informática y Telecomunicaciones

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 35
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones implícitas de AWK
 Las funciones implícitas (Built-in) 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 36
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 lista parcial 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 37
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 38
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 archivos
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 AWK no 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 39

También podría gustarte