Você está na página 1de 37

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
 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]

 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 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

 Para  imprimir  en  pantalla  el  segundo  campo 


del archivo arch. arch tiene que ser un archivo 
con campos delimitados por “:”.

[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  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 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.
[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 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.

 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 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}′

 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 32
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 33
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 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