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