Padsemana 12
Padsemana 12
Padsemana 12
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
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:
© 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”.
Desarrollo
Uso básico de AWK
© 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:
© 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:
© 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}
© 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.
© 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
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