WEB y TEXT MINING
Web Log Analysis con AWKJuan Azcurra
Log del web server Apache
 El log que guarda un servidor Apache contiene la siguiente
información:
%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"
 Donde:
 %h: IP del cliente.
 %l: identidad del cliente.
 %u: userid de la persona solicitando el documento.
 %t: hora en la que el servidor finalizó el pedido.
 %r: linea solicitada por el cliente.
 %>s: código de estado que el servidor envia al cliente.
 %b: tamaño en bytes del objeto enviado al cliente.
 %{Referer}: desde donde fue referido.
 %{User-agent}: agente de usuario del cliente.
Códigos de estado
 Códigos de respuesta:
 200 - OK
 206 - Partial Content
 301 - Moved Permanently
 302 - Found
 304 - Not Modified
 401 - Unauthorised (password required)
 403 - Forbidden
 404 - Not Found
 301 o 302 indican que hubo una redirección.
 304 indica que el objeto ya se encontraba en la cache del
cliente.
 404 indica que el link está corrupto.
GAWK – Introducción
 Un lenguaje muy potente para procesamiento de texto y búsqueda
de patrones.
 GAWK es una versión GNU de AWK.
 Sintáxis similar a C.
 http://www.gnu.org/software/gawk
 El nombre AWK proviene de las iniciales de sus diseñadores:
Alfred V. Aho, Peter J. Weinberger, and Brian W. Kernighan.
 La versión original de AWK fue escrita en 1977.
GAWK – Ejecución
 gawk ‘commands’ file
 gawk –f prog.gawk
GAWK – Archivos y campos
 Gawk divide el archivo en registros y campos.
 Cada línea es un registro (por defecto).
 Los campos son delimitados por un carácter
especial.
 Por defecto: espacio en blanco (blanco o tab).
 Puede ser cambiado con la opción –F
 Ej. Para indicar que el campo está separado por
comas, usar:
 Gawk –F “,” archivo.csv
GAWK – Campos y variables
 Los campos son accedidos por el prefijo $
 Variables especiales:
 $1 es el primer campo, $2 es el segundo campo,
…
 $0 es un campo especial que contiene todo el
registro.
 NF es una variable especial que indica el número
de campos en el registro actual.
 NR es una variable especial que indica el número
de registro actual.
GAWK - Condiciones
gawk –F "d" 'condición' archivo
 GAWK procesa cada linea del archivo, usando
el delimitado por defecto para dividir cada
linea en campos.
 La acción por defecto es imprimir la linea
completa.
Ejemplo con archivo de prueba
 Utilizaremos el archivo d100.log que contiene
las 100 primeras lineas del archivo de log de
Kdnuggets del 16/11/05,
 Se presentarán algunos códigos de ejemplo
que pueden utilizarse con el archivo completo.
Archivo de prueba d100.log
ip1664.com - - [16/Nov/2005:00:00:43 -0500] "GET /robots.txt HTTP/1.0" 200 173 "-" "msnbot/1.0
(+http://search.msn.com/msnbot.htm)"
ip1664.com - - [16/Nov/2005:00:00:43 -0500] "GET /gpspubs/sigkdd-kdd99-panel.html HTTP/1.0" 200 14199 "-
" "msnbot/1.0 (+http://search.msn.com/msnbot.htm)"
ip2283.unr - - [16/Nov/2005:00:01:02 -0500] "GET /dmcourse/data_mining_course/assignments/assignment-
3.html HTTP/1.1" 200 8090
"http://www.google.com/search?hl=en&q=use+of+data+cleaning+in+data+mining&spell=1" "Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.1; SV1)"
ip2283.unr - - [16/Nov/2005:00:01:03 -0500] "GET /dmcourse/dm.css HTTP/1.1" 200 155
"http://www.kdnuggets.com/dmcourse/data_mining_course/assignments/assignment-3.html" "Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.1; SV1)"
ip1389.net - - [16/Nov/2005:00:02:46 -0500] "GET /gpspubs/kdd99-est-ben-lift/sld021.htm HTTP/1.1" 200
1385 "http://www.google.com/search?hs=JnE&hl=en&lr=&client=opera&rls=en&q=lift+curve&btnG=Search"
"Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.5"
ip1389.net - - [16/Nov/2005:00:02:46 -0500] "GET /gpspubs/kdd99-est-ben-lift/img021.gif HTTP/1.1" 200
7465 "http://www.kdnuggets.com/gpspubs/kdd99-est-ben-lift/sld021.htm" "Mozilla/4.0 (compatible; MSIE
6.0; X11; Linux i686; en) Opera 8.5"
ip1389.net - - [16/Nov/2005:00:02:47 -0500] "GET /favicon.ico HTTP/1.1" 200 899
"http://www.kdnuggets.com/gpspubs/kdd99-est-ben-lift/sld021.htm" "Mozilla/4.0 (compatible; MSIE 6.0;
X11; Linux i686; en) Opera 8.5"
ip1946.com - - [16/Nov/2005:00:02:49 -0500] "GET /news/2001/n10/15i.html HTTP/1.0" 200 4214 "-"
"Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)“
Ejemplo 1: Líneas con estado !=
200
 Código de estado se encuentra en el campo $9
 Cuántas lineas tienen el código de estado distinto
de 200? :
gawk '$9 != 200' d100.log
Resultado: 27
Para contar el estado igual a 200, usar:
'$9 == 200'
no '$9 = 200' (esto setea $9 al valor 200)
Ejempo 2: Contar referencias de
Google
 Gawk tiene un poderoso evaluador de
patrones
 variable ~ "pattern"
 Ejemplo: cuántas líneas del log tiene la
referencia (campo $11) desde google:
gawk '$11 ~ "google"' d100.log
Resultado: 2
Ejemplo 3: Condiciones
complejas
 Cuántos hits tienen el método GET y estado
404?
 (status 404 es un código de error)
 El método está en $6, pero el método está
separado por un espacio. Se puede utilizar:
gawk '$6 ~ "GET" && $9 == 404' d100.log
Resultado: 1
Ejemplo 4a: Contando solicitudes
de HTML
 El archivo solicitado está en el campo $7, se
puede utilizar esta condición para evaluar si
terminar con .html
 Nota: $ en una expresión regular indica el fin
de la cadena.
gawk '$7 ~ ".html$"' d100.log
Resultado: 21
Ejemplo 4b: Contando solicitudes
de HTM o HTML
Algunos archivos finalizan con .html, se puede
utilizar:
gawk '$7 ~ ".html$|.htm$"'
d100.log
Resultado: 22
 O también:
gawk '$7 ~ ".htm"' d100.log
Resultado: 22
Ejemplo 4c: Contado solicitudes de
directorios
 Algunos pedidos pueden ser a un directorio,
por ejemplo un pedido a www.kdnuggets.com/
tendría el literal "GET / HTTP/1.1".
 Para contar estas solicitudes:
gawk '$7 ~ "/$"' d100.log
Resultado: 6
Ejemplo 4d: Contando todas las
solicitudes HTML
 o contar html, htm y directorios con:
gawk '$7 ~ "(html|htm|/)$"'
d100.log
Resultado: 28
GAWK – Cálculos
 Forma general de la sentencia
gawk '{sentencias;…}' archivo
 Las sentencias son ejecutadas para cada
línea del archivo.
 Las sentencias incluyen condicionales, loops,
etc.
Ejemplo 5: Referencias
externas
 Imprimir referencias a páginas html,
excluyendo acceso directo (donde la
referencia es "-" )
 Nota: para testear si $11 es "-", es
necesario utilizar la comilla con escape "
 Código:
gawk '{if ($7~"html$" &&
$11!=""-"") print $11}'
d100.log
Resultado: 7
GAWK – Sentencias BEGIN,
END
 Para ejecutar sentencias antes de leer la
primera linea se utiliza la palabra clave BEGIN
 Para ejecutar sentencias despues de leer la
última linea se utiliza la palabra clave END
gawk 'BEGIN{sent1;…} {sent2;…} END
{sent3;…}' archivo
Ejemplo 6
 Sumar los bytes transmitidos con código de
estado 200
gawk '{if ($9 == 200) suma += $10}
END{print suma}' d100.log
Resultado: 396460
Nota: no es necesario inicializar suma, todas
las variables son inicializadas en 0 por
defecto.
GAWK - Arreglos
 Es posible utilizar variables compuestas
 Por ejemplo, imprimir la cantidad de hits por
IP:
gawk '{!a[$1]++} END {for(i in
a) print i, a[i]}'d100.log
Resultado:
ip2171.unr 1
ip967.com 5
ip1037.com 1

Web Log Analysis - AWK

  • 1.
    WEB y TEXTMINING Web Log Analysis con AWKJuan Azcurra
  • 2.
    Log del webserver Apache  El log que guarda un servidor Apache contiene la siguiente información: %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"  Donde:  %h: IP del cliente.  %l: identidad del cliente.  %u: userid de la persona solicitando el documento.  %t: hora en la que el servidor finalizó el pedido.  %r: linea solicitada por el cliente.  %>s: código de estado que el servidor envia al cliente.  %b: tamaño en bytes del objeto enviado al cliente.  %{Referer}: desde donde fue referido.  %{User-agent}: agente de usuario del cliente.
  • 3.
    Códigos de estado Códigos de respuesta:  200 - OK  206 - Partial Content  301 - Moved Permanently  302 - Found  304 - Not Modified  401 - Unauthorised (password required)  403 - Forbidden  404 - Not Found  301 o 302 indican que hubo una redirección.  304 indica que el objeto ya se encontraba en la cache del cliente.  404 indica que el link está corrupto.
  • 4.
    GAWK – Introducción Un lenguaje muy potente para procesamiento de texto y búsqueda de patrones.  GAWK es una versión GNU de AWK.  Sintáxis similar a C.  http://www.gnu.org/software/gawk  El nombre AWK proviene de las iniciales de sus diseñadores: Alfred V. Aho, Peter J. Weinberger, and Brian W. Kernighan.  La versión original de AWK fue escrita en 1977.
  • 5.
    GAWK – Ejecución gawk ‘commands’ file  gawk –f prog.gawk
  • 6.
    GAWK – Archivosy campos  Gawk divide el archivo en registros y campos.  Cada línea es un registro (por defecto).  Los campos son delimitados por un carácter especial.  Por defecto: espacio en blanco (blanco o tab).  Puede ser cambiado con la opción –F  Ej. Para indicar que el campo está separado por comas, usar:  Gawk –F “,” archivo.csv
  • 7.
    GAWK – Camposy variables  Los campos son accedidos por el prefijo $  Variables especiales:  $1 es el primer campo, $2 es el segundo campo, …  $0 es un campo especial que contiene todo el registro.  NF es una variable especial que indica el número de campos en el registro actual.  NR es una variable especial que indica el número de registro actual.
  • 8.
    GAWK - Condiciones gawk–F "d" 'condición' archivo  GAWK procesa cada linea del archivo, usando el delimitado por defecto para dividir cada linea en campos.  La acción por defecto es imprimir la linea completa.
  • 9.
    Ejemplo con archivode prueba  Utilizaremos el archivo d100.log que contiene las 100 primeras lineas del archivo de log de Kdnuggets del 16/11/05,  Se presentarán algunos códigos de ejemplo que pueden utilizarse con el archivo completo.
  • 10.
    Archivo de pruebad100.log ip1664.com - - [16/Nov/2005:00:00:43 -0500] "GET /robots.txt HTTP/1.0" 200 173 "-" "msnbot/1.0 (+http://search.msn.com/msnbot.htm)" ip1664.com - - [16/Nov/2005:00:00:43 -0500] "GET /gpspubs/sigkdd-kdd99-panel.html HTTP/1.0" 200 14199 "- " "msnbot/1.0 (+http://search.msn.com/msnbot.htm)" ip2283.unr - - [16/Nov/2005:00:01:02 -0500] "GET /dmcourse/data_mining_course/assignments/assignment- 3.html HTTP/1.1" 200 8090 "http://www.google.com/search?hl=en&q=use+of+data+cleaning+in+data+mining&spell=1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" ip2283.unr - - [16/Nov/2005:00:01:03 -0500] "GET /dmcourse/dm.css HTTP/1.1" 200 155 "http://www.kdnuggets.com/dmcourse/data_mining_course/assignments/assignment-3.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" ip1389.net - - [16/Nov/2005:00:02:46 -0500] "GET /gpspubs/kdd99-est-ben-lift/sld021.htm HTTP/1.1" 200 1385 "http://www.google.com/search?hs=JnE&hl=en&lr=&client=opera&rls=en&q=lift+curve&btnG=Search" "Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.5" ip1389.net - - [16/Nov/2005:00:02:46 -0500] "GET /gpspubs/kdd99-est-ben-lift/img021.gif HTTP/1.1" 200 7465 "http://www.kdnuggets.com/gpspubs/kdd99-est-ben-lift/sld021.htm" "Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.5" ip1389.net - - [16/Nov/2005:00:02:47 -0500] "GET /favicon.ico HTTP/1.1" 200 899 "http://www.kdnuggets.com/gpspubs/kdd99-est-ben-lift/sld021.htm" "Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.5" ip1946.com - - [16/Nov/2005:00:02:49 -0500] "GET /news/2001/n10/15i.html HTTP/1.0" 200 4214 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)“
  • 11.
    Ejemplo 1: Líneascon estado != 200  Código de estado se encuentra en el campo $9  Cuántas lineas tienen el código de estado distinto de 200? : gawk '$9 != 200' d100.log Resultado: 27 Para contar el estado igual a 200, usar: '$9 == 200' no '$9 = 200' (esto setea $9 al valor 200)
  • 12.
    Ejempo 2: Contarreferencias de Google  Gawk tiene un poderoso evaluador de patrones  variable ~ "pattern"  Ejemplo: cuántas líneas del log tiene la referencia (campo $11) desde google: gawk '$11 ~ "google"' d100.log Resultado: 2
  • 13.
    Ejemplo 3: Condiciones complejas Cuántos hits tienen el método GET y estado 404?  (status 404 es un código de error)  El método está en $6, pero el método está separado por un espacio. Se puede utilizar: gawk '$6 ~ "GET" && $9 == 404' d100.log Resultado: 1
  • 14.
    Ejemplo 4a: Contandosolicitudes de HTML  El archivo solicitado está en el campo $7, se puede utilizar esta condición para evaluar si terminar con .html  Nota: $ en una expresión regular indica el fin de la cadena. gawk '$7 ~ ".html$"' d100.log Resultado: 21
  • 15.
    Ejemplo 4b: Contandosolicitudes de HTM o HTML Algunos archivos finalizan con .html, se puede utilizar: gawk '$7 ~ ".html$|.htm$"' d100.log Resultado: 22  O también: gawk '$7 ~ ".htm"' d100.log Resultado: 22
  • 16.
    Ejemplo 4c: Contadosolicitudes de directorios  Algunos pedidos pueden ser a un directorio, por ejemplo un pedido a www.kdnuggets.com/ tendría el literal "GET / HTTP/1.1".  Para contar estas solicitudes: gawk '$7 ~ "/$"' d100.log Resultado: 6
  • 17.
    Ejemplo 4d: Contandotodas las solicitudes HTML  o contar html, htm y directorios con: gawk '$7 ~ "(html|htm|/)$"' d100.log Resultado: 28
  • 18.
    GAWK – Cálculos Forma general de la sentencia gawk '{sentencias;…}' archivo  Las sentencias son ejecutadas para cada línea del archivo.  Las sentencias incluyen condicionales, loops, etc.
  • 19.
    Ejemplo 5: Referencias externas Imprimir referencias a páginas html, excluyendo acceso directo (donde la referencia es "-" )  Nota: para testear si $11 es "-", es necesario utilizar la comilla con escape "  Código: gawk '{if ($7~"html$" && $11!=""-"") print $11}' d100.log Resultado: 7
  • 20.
    GAWK – SentenciasBEGIN, END  Para ejecutar sentencias antes de leer la primera linea se utiliza la palabra clave BEGIN  Para ejecutar sentencias despues de leer la última linea se utiliza la palabra clave END gawk 'BEGIN{sent1;…} {sent2;…} END {sent3;…}' archivo
  • 21.
    Ejemplo 6  Sumarlos bytes transmitidos con código de estado 200 gawk '{if ($9 == 200) suma += $10} END{print suma}' d100.log Resultado: 396460 Nota: no es necesario inicializar suma, todas las variables son inicializadas en 0 por defecto.
  • 22.
    GAWK - Arreglos Es posible utilizar variables compuestas  Por ejemplo, imprimir la cantidad de hits por IP: gawk '{!a[$1]++} END {for(i in a) print i, a[i]}'d100.log Resultado: ip2171.unr 1 ip967.com 5 ip1037.com 1