Tracks
/
AWK
AWK
/
Temario
/
Fundamentos
Fu

Fundamentos en AWK

1 ejercicio

Acerca de Fundamentos

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

Patrones y acciones

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.

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 la nueva 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 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.

Variables de campo

Te refieres a los campos como $1, $2, $3, etc.

El registro actual es $0.

Caution

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.

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 una nueva 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 aportan 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 de registro actual.
    • Cuando se están procesando varios ficheros de entrada, 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.
    • Para ilustrar la diferencia entre NR y FNR, aquí tienes un modismo habitual de AWK.
      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.

Concepto de verdad

AWK usa el mismo concepto de verdad 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.
Note

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.

Caution

Una rareza a la que hay que prestar atención

  • El número 0 es falso.
  • ¡El string no vacío "0" es verdadero!

Profundizaremos más en los tipos de datos de AWK en conceptos posteriores.

Comentarios

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

Cómo dar entrada a 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}'

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:

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

Algunos ejemplos más

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
    
Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Fundamentos