Nos referiremos al lenguaje como AWK y al ejecutable que interpreta los programas de AWK como awk o gawk.
Un programa de AWK se compone de pares de patrón y acción
pattern1 { action1 }
pattern2 { action2 }
...
Un patrón puede ser un patrón de expresión regular con el que se compara la entrada. También puede ser cualquier expresión que dé como resultado un valor verdadero o falso.
Una acción es uno o más comandos de AWK. Las llaves que la encierran son obligatorias.
Si el resultado del patrón es verdadero, entonces 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 evaluará la acción asociada antes de que se consuma cualquier entrada.END evaluará 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.
Aquí tienes otras variables integradas que se usan con frecuencia.
RS es el separador de registros de la entrada.
Como se mencionó, su valor predeterminado es un salto de línea.FS es el separador de campos de la entrada.Estas variables con frecuencia se establecen en el bloque de acción BEGIN.
AWK establece estas variables automáticamente durante la ejecución del programa.
NF guarda el número de campos del registro actual.
$NF.NR guarda el número del registro actual.
NR contendrá el número total de registros procesados hasta el momento.FNR guarda el número del registro actual del archivo de entrada actual.
NR == FNR {action}
Esto significa «si el número de registro acumulado es igual al número de registro del archivo actual».
Esto solo puede ser verdadero para los registros del primer archivo de entrada.AWK usa el mismo concepto de veracidad que C.
0 es falso.Como AWK es un lenguaje de procesamiento de texto, los valores de verdad se extienden a los string.
"" es falso.Los comentarios comienzan con el carácter # y se extienden hasta el final de la línea.
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 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 su shell de inicio de sesión, podemos hacer:
awk '
BEGIN { FS = ":" }
$7 == "/bin/bash" { print $1 }
' /etc/passwd
Había una vez una ciudad bulliciosa llamada Cyberspace. Cyberspace era una metrópolis digital, con millones de habitantes que iniciaban y cerraban sesión todos los días. Para llevar un registro de todos estos usuarios, Cyberspace tenía un archivo especial llamado /etc/passwd.
El archivo /etc/passwd era como una guía telefónica de la ciudad. En él se listaba cada usuario que tenía una cuenta en el sistema, junto con información importante sobre cada uno:
| n | campo |
|---|---|
| 1 | nombre de usuario |
| 2 | contraseña («x» indica que la contraseña real se guarda en otro lugar, por seguridad) |
| 3 | UID, un ID de usuario numérico único |
| 4 | GID, un ID de grupo numérico único (normalmente el mismo que el UID) |
| 5 | información del usuario (normalmente el nombre completo del usuario, pero puede incluir otra información) |
| 6 | directorio home |
| 7 | shell de inicio de sesión |
Los campos están separados por un carácter de dos puntos. Esta es una entrada típica:
glennj:x:1010:1010:Glenn Jackman:/home/glennj:/usr/local/bin/fish
El archivo lo administraba un equipo de administradores de sistemas, que se encargaban de crear cuentas nuevas, actualizar las cuentas existentes y eliminar las antiguas. Los administradores de sistemas eran los guardianes de Cyberspace, y se aseguraban de que solo los usuarios autorizados pudieran acceder al sistema.
Un día, contrataron a un nuevo administrador de sistemas llamado Alex para que se uniera al equipo. A Alex le emocionaba el puesto y aprendió rápido los entresijos del archivo /etc/passwd. Aprendió a agregar usuarios nuevos al sistema, a actualizar la información de los usuarios y a eliminar usuarios antiguos.
Mientras trabajaba en el archivo /etc/passwd, Alex notó algo extraño. Algunos usuarios tenían directorios home extraños o poco habituales. Algunos usuarios tenían su directorio home configurado como /dev/null, mientras que otros lo tenían configurado con rutas extrañas que no existían.
Alex se dio cuenta de que esos usuarios no eran personas reales, sino cuentas falsas que habían creado unos hackers. Los hackers habían encontrado la forma de explotar una vulnerabilidad del sistema y habían creado esas cuentas falsas para obtener acceso a Cyberspace.
Alex sabía que había que actuar. Usó awk para analizar el archivo /etc/passwd y escribió un script para identificar todas las cuentas falsas. Luego trabajó con el resto del equipo para eliminar esas cuentas y para parchear la vulnerabilidad que había permitido a los hackers crearlas.
Gracias al uso de awk por parte de Alex, el equipo pudo identificar y eliminar las cuentas falsas, y hacer de Cyberspace un lugar más seguro para todos. Los administradores de sistemas siguieron administrando el archivo /etc/passwd, manteniéndolo actualizado y seguro, y asegurándose de que solo los usuarios autorizados pudieran acceder al sistema.
Ahora es tu turno de ser un administrador de sistemas como Alex.
Aquí tienes algo de sintaxis AWK adicional que necesitarás para resolver este ejercicio.
Los operadores booleanos son similares a los de otros lenguajes:
| operación | ejemplo |
|---|---|
| AND | expr1 && expr2 |
| OR | expr1 || expr2 |
| NOT | ! expr |
Llamar a una función tiene una sintaxis familiar:
function greet(name) {
print "Hello", name
}
BEGIN {
greet("Mary") # prints "Hello Mary"
}
Escribe un programa en awk que imprima el primer campo separado por dos puntos de cada línea del archivo passwd.
Escribe un comando awk que imprima el número de línea de cada registro del archivo de entrada. Imprime solo el número de línea, y ninguna otra información.
En Cyberspace, un directorio home «válido» comienza con /home o /root.
Imprime los registros del archivo de entrada con directorios home no válidos.
Imprime los registros donde el directorio home es válido y el shell de inicio de sesión es bash.
Regístrate en Exercism para aprender y dominar AWK con 3 conceptos92 ejercicios y mentoría humana real, todo gratis.