2009/Nodos/Introducción a AWK en 12 ejemplos/Documentación

De Hackmeeting

(Diferencias entre revisiones)

Revisión actual

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







Herramientas personales
wiki-navigation
project-navigation