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 [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)