2009/Nodos/Introducción a AWK en 12 ejemplos/Documentación
De Hackmeeting
Script para visualizar la charla:
#!/bin/bash
awk '/^###/{system("read N;clear"); print ;next} /^·/{system("read N"); print ;next} {print $0}' awk_hm.txt
Archivo awk_hm.txt
#### HACKMEETING 2009 - AWK (1/12) ####
Normanlente encontramos AWK de esta forma:
· ps -ef| grep root| awk '{print $8}'
· Es la mejor forma de selecionar columnas de un fichero
Pero si miras el man, podrás aprender alguna cosa más
· podemos quitar el grep:
ps -ef| awk '/root/{print $8}'
· nos aseguramos que buscamos root en la columna de usuario:
ps -ef| awk '$1 ~ /root/{print $8}'
· imprimimos la cadena completa de comando y argumentos:
ps -ef| awk '$1 ~ /root/{$1=$2=$3=$4=$5=$6=$7=""; printf $0}'
· tampoco hay que fliparse, a veces es mejor utilizar otros comandos
ps -ef| awk '$1 ~ /root/{print $0}'| cut -c47-
#### HACKMEETING 2009 - AWK (2/12) ####
AWK es una herramienta
- muy potente para hacer varias cosas a la vez
- codigo muy condesado
- muy eficiente
· se utiliza como filtro de documentos y salidas de comandos (parseador)
es una herramienta multiusos en linea de comandos y pequeños scripts
· awk busqueda { acción }
busqueda { acción }
...
#### HACKMEETING 2009 - AWK (3/12) ####
Puedes hacer operaciones matemáticas, sin más.
· ls -l *pdf| awk '{S+=$5 } '
· ls -l *pdf| awk '{S+=$5 } END{print "Total " S/2^10 "Media " S/NR}'
· BEGIN{ acción} ... END{ acción}
Se ejecuta antes y despues de procesar las líneas de datos.
Se suele utilizar para inicializar variables, escribir cabezeras, y resultados finales.
· ls -l *pdf| awk '{S+=$5 } END{print "Total " S/2^10" Kb Media " int(S/NR/2^10)" Kb"}'
· find . -name "*pdf" -ls | awk '{S+=$7 } i\
END{print "Total " NR" Ficheros " S/2^20" Mb Media " int(S/NR/2^10)" Kb"}'
#### HACKMEETING 2009 - AWK (4/12) ####
AWK es realmente potente en búsquedas de grandes ficheros de logs.
· awk '/Windows/{ T=$4 }' access.log
· awk '/Windows/{if (T!=$4) N=0; else N++ ;T=$4; }' access.log
· Sentencias de control de flujo:
if ( expr ) statement else statement
for ( opt_expr ; opt_expr ; opt_expr ) statement
while ( expr ) statement
· awk '/Windows/{if (T!=$4) N=0; else N++ ;T=$4; if( N > 10 ) print T" "N}' access.log
· awk '/Windows/{if (T!=$4) N=0; else N++ ;T=$4; if( N == 11 ) \
system("echo "T" "N" Conexiones | mailx -s \"Ataque Windows\" fmartin" )}' access.log
#### HACKMEETING 2009 - AWK (5/12) ####
Tenemos disponibles un buen número de funciones
manejo de cadena: index(s,t) length(s) match(s,r) substr(s,i,n)
· aritmeticas: cos(x) exp(x) int(x)
· Y tambien tenemos el comando printf que nos permite dar formato a la salidas de
la forma necesaria, es similar a C: printf formato, lista-expresiones
· acpi | awk '{N=int($4/10); printf "[%-10."N"s] %s\n","##########",$4}'
· acpi | awk '{printf "[%-10."int($4/10)"s] %s\n","##########",$4}'
#### HACKMEETING 2009 - AWK (6/12) ####
Separadores de campo con -F
otras variables internas FS RS NF NR OFS
· awk '{print $4}' access.log| awk -F"/" '{print $1}'| sort -u
· Admite tantos campos separadores como necesitemos
· awk '{print $4}' access.log| awk -F"/|:|[" '{print $1" "$2" "$4}' | sort -u
· Tambien se pueden usar cadenas de varios careacteres con separador
#### HACKMEETING 2009 - AWK (7/12) ####
Veamos un ejemplo que busca las líneas entre dos marcas en un texto.
· awk '/<!-- start content -->/{P="on";print ""}
· awk '/<!-- start content -->/{P="on";print ""} /<b>Resumen<\/b>:<br \/>/{P="off"} \
· { if (P == "on") {gsub("<[^<]*>","",$0);
· awk '/<!-- start content -->/{P="on";print ""} /<b>Resumen<\/b>:<br \/>/{P="off"} \
{ if (P == "on") {gsub("<[^<]*>","",$0); if (NF > 0 ) print $0}}' charla.html
La variable P la utilizamos para saber si tenemos que imprimir o no
de esta forma se imprimen varias líneas entre dos marcas.
#### HACKMEETING 2009 - AWK (8/12) ####
Y hay mucho más: arrays, funciones definidas por el usuario,
programas awk ( #!/usr/bin/awk ), pasarle variables de entorno, etc
#### HACKMEETING 2009 - AWK (9/12) ####
· Esta charla se visualiza con el siguiente comando:
· awk '/^###/{system("read N;clear"); print ;next} \
/^·/{system("read N"); print ;next} {print $0}' awk_hm.txt
Con next avanzamos una línea en la entrada.
#### HACKMEETING 2009 - AWK (10/12) ####
PREGUNTAS ????
#### HACKMEETING 2009 - AWK (11/12) ####
man awk
http://www.loquefaltaba.com/documentacion/Manual_Awk_castellano.pdf
· Francisco Martín ffmartin@gmail.com
· GRACIAS !!!!
#### HACKMEETING 2009 - AWK (12/12) ####
FIN

