Rutas
/
AWK
AWK
/
Ejercicios
/
Fundamentos
Fundamentos

Fundamentos

Ejercicio de aprendizaje

Introducción

Fundamentos

Nos referiremos al lenguaje como AWK y al ejecutable que interpreta los programas de AWK como awk o gawk.

Patrones y acciones

Un programa de AWK se compone de pares patrón-acción

pattern1 { action1 }
pattern2 { action2 }
...

Un patrón puede ser un patrón de expresión regular con el que comparar la entrada. También puede ser cualquier expresión que dé como resultado un valor verdadero/falso.

Una acción es uno o varios comandos de AWK. Las llaves que la encierran son obligatorias.

Si el resultado del patrón es verdadero, se evalúa la acción correspondiente.

Registros y campos

AWK analiza la entrada como una serie de registros. Cada registro se divide en cero o más campos.

El comportamiento predeterminado es:

  • dividir la entrada en registros usando el salto de línea como «separador de registros», de modo que cada línea es un registro.
  • dividir el registro en campos usando los espacios en blanco como «separador de campos», de modo que cada palabra es un campo.

Patrones y acciones (continuación)

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.

Patrones especiales

Hay dos patrones especiales que se usan con frecuencia.

  • BEGIN evaluará la acción asociada antes de que se consuma ninguna entrada.
  • END evaluará la acción asociada después de que se consuma toda la entrada.

Variables de campo

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.

Variables integradas que controlan el análisis de la entrada
  • RS es el separador de registros de la entrada. Como se ha mencionado, su valor predeterminado es un salto de línea.
  • FS es el separador de campos de la entrada.

Estas variables suelen establecerse en el bloque de acción BEGIN.

Variables integradas que proporcionan información

AWK establece estas variables automáticamente durante la ejecución del programa.

  • NF almacena el número de campos del registro actual.
    • Para obtener el valor del último campo, usa $NF.
  • NR almacena el número del registro actual.
    • Cuando se están procesando varios archivos de entrada, NR contendrá el número total de registros procesados hasta el momento.
  • FNR almacena el número del registro actual del archivo de entrada actual.
    • Para ilustrar la diferencia entre NR y FNR, aquí tienes un modismo común de AWK.
      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 cierto para los registros del primer archivo de entrada.

Veracidad

AWK usa el mismo concepto de veracidad que C.

  • El número 0 es falso.
  • Cualquier otro número es verdadero.

Como AWK es un lenguaje de procesamiento de texto, los valores de verdad se extienden a los strings.

  • Un string vacío "" es falso.
  • Cualquier string no vacío es verdadero.

Comentarios

Los comentarios empiezan con el carácter # y se extienden hasta el final de la línea.

Ejemplos

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 lo siguiente:

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

Instrucciones

Érase una vez una bulliciosa ciudad llamada Cyberspace. Cyberspace era una metrópolis digital, con millones de habitantes que iniciaban y cerraban sesión cada día. Para llevar un registro de todos esos usuarios, Cyberspace tenía un fichero especial llamado /etc/passwd.

El fichero /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 almacena en otro lugar, por seguridad)
3 UID, un identificador de usuario numérico y único
4 GID, un identificador de grupo numérico y único (normalmente el mismo que el UID)
5 información del usuario (normalmente su nombre completo, pero puede incluir otra información)
6 directorio personal
7 shell de inicio de sesión

Los campos están separados por el carácter dos puntos. Esta es una entrada típica:

glennj:x:1010:1010:Glenn Jackman:/home/glennj:/usr/local/bin/fish

El fichero lo gestionaba un equipo de administradores de sistemas, que se encargaban de crear cuentas nuevas, actualizar las 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. Alex estaba entusiasmado con el puesto y enseguida aprendió los entresijos del fichero /etc/passwd. Aprendió a añadir usuarios nuevos al sistema, a actualizar la información de los usuarios y a eliminar a los usuarios antiguos.

Mientras trabajaba en el fichero /etc/passwd, Alex se dio cuenta de algo extraño. Algunos usuarios tenían directorios personales extraños o inusuales. Algunos usuarios tenían su directorio personal 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 creadas por 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 tenía que actuar. Usó awk para analizar el fichero /etc/passwd y escribió un script para identificar todas las cuentas falsas. Después, 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 que Alex hizo de awk, 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 gestionando el fichero /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.

Note

Aquí tienes algo de sintaxis adicional de AWK 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 conocida:

    function greet(name) {
        print "Hello", name
    }
    BEGIN {
        greet("Mary")   # prints "Hello Mary"
    }
    

1. Lista los nombres de usuario

Escribe un programa awk que imprima el primer campo separado por dos puntos de cada línea del fichero passwd.

2. Imprime los números de línea

Escribe un comando awk que imprima el número de línea de cada registro del fichero de entrada. Imprime solo el número de línea, sin ninguna otra información.

3. Imprime los registros con directorios personales no válidos.

En Cyberspace, un directorio personal «válido» empieza por /home o /root. Imprime los registros del fichero de entrada con directorios personales no válidos.

4. Imprime los usuarios válidos que usan bash

Imprime los registros en los que el directorio personal sea válido y el shell de inicio de sesión sea bash.


Fuente

Conversación con ChatGPT
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
AWK Exercism

¿Listo para empezar Fundamentos?

Regístrate en Exercism para aprender y dominar AWK con 3 conceptos92 ejercicios y mentoría humana real, todo gratis.