Filtros avanzados. El lenguaje AWK

http://www.gnu.org/manual/gawk/index.html

Invocando AWK

    awk [-Fc] [-f archivo programa] | [programa] [parametros] [archivos] 

si se esscribe en linea de comandos el programa va entre apostrofes (comillas) para protegerlo del shell en el que se ejecuta

si lo paso por programa es

    -f archivo_programa

Forma generica del programa awk

forma generica:

    patrones {acciones}

si no esta presente archivo actua para analizar patrones sobre la entrada estandard.

patrones

    espresiones logicas o regulares

acciones

    lenguaje especial

4. Estructura del patron

4.1 BEGIN

Acciones que se ejecutan antes del programa, por ejemplo, para definir variables

        BEGIN {TOTAL=7
                TOTAL1=8}

4.2 END

Acciones que se ejecutan luego del programa. Se usa el mismo formato que para BEGIN 4.3 Notas varias

Las acciones finalizan con ; } o fin de linea

Separador de registros \n

Separador de campos espacio 1 o mas

los campos se invocan en la siguiente forma

$1 $2... $n $0 toda la linea

Si se omite patron, entonces la accion se ejecuta sobre todo el archivo

Si se omite accion, entonces se imprime toda la linea

4.4 Variables fijas

NR

    Numero de registro en el cual se encuentra. Si se esta en el ultimo registro es el total de registros

FS

    Separador de campos (por defecto es espacio en blanco)

RS

    Separador de registro (por defecto \n)

OFS

    Separador de campos para la salida (por defecto SIN separador)

NF

    Numero de Campo

4.5 Variables generales

Las variables no hay necesidad de declararlas, cuando se abren se inician automaticamente

5. ACCIONES (instrucciones)

5.1 Notas varias

Formato general

{instruccion [instrucciones]}

           Las llaves permiten colocar instrucciones una atras de
           otras como si fueran una sola instruccion

Variables

Las variables solamente se declaran y toman el valor correspondiente

VAR =exp

VAR 0=exp

if

if (condicion) instruccion else instruccion2

while

while (condicion)

for

    for (expresion de inicializacion ; condicion ; expresion de incremento) instruccion

espresion de inicializadion

    cualquier cosa que sea asignacion

condicion

    expresion logica

espresion de incremento

    cualquier cosa que increente la variable de control

tambien puede ser:

    for (expresion de inicializacion ; condicion )
        {instruccion
           expresion de incremento}

break

Se usa para salir del ciclo y ponerse en la instruccion siguiente

continue

vuelve al principio del ciclo (ignorando lo que quede por cumplir de ese ciclo)

print

    print [lista de expesiones] [> expresion]

lista de expresiones

    nombre de variables o entre comillas el texto que queremos que se imprima

> expresion

    direccionamiento a un archivo 

>> adicionar

printf

La sintaxis es como C

    printf(formato, lista de expresiones, ... [>expresion])

next

saltea los patrones restantes

exit

sale de todo el programa de ese archivo

sprintf

igual a printf pero escribe en la variable de tipo string

log

devuelve logaritmo decimal de lo que sigue

sqrt

calcula la raiz cuadrada de lo que sigue

exp

calcula la potencia

length

devuelve un numero de la cantidad de caracteres de la linea en la que me encuentro

int

devuelve la parte entera por defecto de un numero real o racional

substr(s,m,n)

devuelve sub cadena de s sacada desde m hasta n

logico:

    || - o
    && - y
    ! - no 

Ejemplos


ls /home/bozo | awk '{print "rm -rf " $1}' | more

ps ax | awk '/ppp/ { print $1 }'

ls -l *txt | awk '{ total += $5 } END{ print total }'

ls -lh /proc/$(ps ax | awk '{ print $1 }' | grep 12099)/exe

cat /proc/$(ps ax | awk '{ print $1 }' | grep $(pidof firefox-bin))/cmdline | xargs -0 echo


/*
imprime segundo campo y luego primero separado por un espacio

Si no se pone la coma, por defecto, queda concatenado
Si se utiliza coma, por defecto, utiliza un espacio
Se puede utilizar \t para tabular la salida entre campo y campo
*/

{print $2, $1}


/*
Existen en awk las 

S += es lo mismo que   S = S+$1

Ejecuta la primera parte para todas las lineas y luego termina con el END

El porcentaje es  S dividido NR (cantidad de lineas)

*/

{S += $1}
END {print "La suma es ", S " el porcenaje es ", S/NR }


/*
imprime cada renglon al reves

*/

{for (I=NF; I<0; --I) 
	print $I}



/*
Tiene patron y accion

relacionales:
< menor
> mayor
<= menor o igual
>= mayor o igual
== igual
!= diferente

en patron se guarda la variable $1 que tiene que ser diferente a previo

Si previo es igual a la linea anterior entonces no la imprime, la imprime
solamente si es distinta a la anterior

/*

$1 != previo {print; previo=$1}


#muestra solo algunas columnas del ls
#ls -l | awk 'BEGIN {OFS="\t"}{print $9, $5, $6, $7}'
ls -l | awk '{print $9"\t" $5"\t" $6, $7}'


/* imprime la tabla ascii

c = caracter
s = string hasta nulvyte
d = decimal
o = octal
f = floating point
x = hexadecimal
e = exopencial

El uso de printf es igual a C

*/

for (i=30; c<255; i++)
	printf("caracter %c\t%d\t%o\n", i, i, i)




Última modificación de la página el 2007-11
Powered by PmWiki