Estructuras De Control en AWK
AWK procesa sus entradas línea por linea, aplicando las acciones al patrón si este es verdadero o si aplica.
{ pattern } { actions }
El patrón puede ser tan sencillo o tan complejo como lo podamos hacer, pero una vez encontrada la línea, podemos tener diferentes acciones dependiendo de su valor. Para esto, utilizamos la estructura if.
La declaración de if de awk puede ser de 3 tipos:
- if (condicion) { acciones }
- if (condicion) { acciones } else { otras acciones }
- if (condicion1) { acciones } else if (condicion2) { otras acciones }
Ejemplos, en un log complejo, podemos combinar el patrón básico, con el condicional, if.
control-ex.csv
2008-01-24,mydomain.com,nic@mydomain.com
2008-01-24,07:29:04.7086,07:39:42.0148,129491.280,72320.304,12.13,1,RED
2008-01-24,03:43:12.0558,03:51:21.1126,403411.293,72021.458,32.45,0,GRN
2008-01-24,11:45:32.0033,12:02:37.6765,152728.234,72301.350,12.26,0,RED
2008-01-24,23:08:45.2057,23:39:51.8793,702478.796,70321.028,42.37,0,BLU
2008-01-25,mydomain.com,peter@mydomain.com
2008-01-25,14:20:23.0142,15:17:30.8416,503296.230,70321.058,12.27,1,BLK
2008-01-25,01:29:04.0013,01:29:41.0349,153495.931,72301.301,17.08,0,BLK
2008-01-25,09:21:12.0165,10:02:12.3142,207521.238,70321.018,18.95,1,WHT
2008-01-25,23:29:51.1058,23:39:25.2147,393492.739,72021.300,19.66,0,WHT
Como se puede ver este log es bastante complejo, lleva dos tipos de líneas con diferente numero de registros por lo que podemos hacer un procesamiento usando ifs.
Para el primer paso, podemos extraer los dominios con un if sencillo:
#!/bin/gawk
# PROGRAMA: control1.awk
# AUTOR: Otto Hahn Herrera
# FECHA: 2020-06-03
# PROPOSITO: Demostrar el uso del if en AWK
BEGIN { FS="," }
{ if (NF == 3)
{ print $2;
C = 1 }
}
Si tenemos que generar una tabla para alimentar una base de datos, lo podemos hacer con un if-else
#!/bin/gawk
# PROGRAMA: control2.awk
# AUTOR: Otto Hahn Herrera
# FECHA: 2020-06-03
# PROPOSITO: Demostrar el uso del if-else en AWK
BEGIN { FS=","; OFS="|"}
{ if (NF == 3)
{ C = $2 }
else
{ print C, $1, $2, $6 }
}
Y si necesitamos transformar esos datos un poco, podemos usar if-else if
#!/bin/gawk
# PROGRAMA: control3.awk
# AUTOR: Otto Hahn Herrera
# FECHA: 2020-06-03
# PROPOSITO: Demostrar el uso del if-else if en AWK
BEGIN { FS=","; OFS="|"}
{ if (NF == 3)
{ C = $2 }
else
{ if ($6 <= 15) V = "LOW";
else if ($6 > 15 && $6 <= 20) V = "MID";
else V = "HIGH";
print C, $1, $2, V }
}