Nos referiremos al lenguaje como AWK y al ejecutable que interpreta los programas AWK como awk o gawk.
Un programa AWK se compone de pares patrón-acción
pattern1 { action1 }
pattern2 { action2 }
...
Un patrón puede ser una expresión regular con la que buscar coincidencias en la entrada. También puede ser cualquier expresión que dé como resultado un valor verdadero/falso.
Una acción es uno o más comandos AWK. Las llaves que la encierran son obligatorias.
Si el resultado del patrón es verdadero, se evalúa la acción correspondiente.
AWK analiza la entrada como una serie de registros. Cada registro se divide en cero o más campos.
El comportamiento predeterminado es:
El patrón se puede omitir, en cuyo caso la acción se evalúa para cada registro de entrada.
La acción se puede omitir, en cuyo caso la acción predeterminada es imprimir el registro actual.
Hay dos patrones especiales que se usan con frecuencia.
BEGIN evalúa la acción asociada antes de que se consuma ninguna entrada.END evalúa la acción asociada después de que se consuma toda la entrada.Te refieres a los campos como $1, $2, $3, etc.
El registro actual es $0.
Para ser explícitos, no son estrictamente «variables».
El $ se puede considerar un operador que obtiene el valor del número de campo dado.
Profundizaremos en esto en conceptos posteriores.
Aquí tienes otras variables integradas que se usan con frecuencia.
RS es el separador de registros de la entrada.
Como se ha mencionado, su valor predeterminado es una nueva línea.FS es el separador de campos de la entrada.Estas variables suelen establecerse en el bloque de acción BEGIN.
AWK establece estas variables automáticamente durante la ejecución del programa.
NF almacena el número de campos del registro actual.
$NF.NR almacena el número de registro actual.
NR contendrá el número total de registros procesados hasta el momento.FNR almacena el número de registro actual del fichero de entrada actual.
NR == FNR {action}
Esto significa «si el número de registro acumulado es igual al número de registro del fichero actual».
Esto solo puede ser cierto para los registros del primer fichero de entrada.AWK usa el mismo concepto de verdad que C:
0 es falso.Como AWK es un lenguaje de procesamiento de texto, los valores de verdad se extienden a los strings.
"" es falso.AWK usa el mismo concepto de verdad que C
AWK se originó en Bell Labs en la década de 1970, en el mismo entorno en el que se inventó C. C tuvo una gran influencia en la sintaxis de AWK.
Una rareza a la que hay que prestar atención
0 es falso."0" es verdadero!Profundizaremos más en los tipos de datos de AWK en conceptos posteriores.
Los comentarios empiezan con el carácter # y se extienden hasta el final de la línea.
awk
awk puede leer la entrada de ficheros o de la entrada estándar.
Cualquiera de estas técnicas funcionará.
awk '/regex/ {print $1}' file1 file2 ...
awk '/regex/ {print $1}' < file
some_command_here | awk '/regex/ {print $1}'
En los sistemas tipo Unix, /etc/passwd contiene información sobre los usuarios.
Cada usuario se describe en una línea aparte, con los campos separados por dos puntos.
Para listar los nombres de usuario:
awk '
BEGIN { FS = ":" }
{ print $1 }
' /etc/passwd
Fíjate en que la acción {print $1} no tiene patrón, así que se ejecuta para cada registro.
Si queremos limitar la salida a solo los usuarios que usan bash como shell de inicio de sesión, podemos hacer:
awk '
BEGIN { FS = ":" }
$7 == "/bin/bash" { print $1 }
' /etc/passwd
Aquí tienes algunos programas awk que producen los mismos resultados que otros comandos Unix habituales.
Mostrar un fichero
cat file.txt
awk '1' file.txt
Buscar patrones en un fichero
grep 'foo.*bar' file.txt
awk '/foo.*bar/' file.txt
Mostrar solo unas pocas líneas al principio de un fichero
head -n 20 file.txt
awk '
1
NR == 20 {exit}
' file.txt
Reemplazar texto en un fichero
sed 's/foo/bar/' file.txt
awk '{sub(/foo/, "bar")};1' file.txt
# or more readably
awk '
{
sub(/foo/, "bar")
print
}
' file.txt