AWK es un lenguaje de programación diseñado para procesar datos basados en texto, ya sean ficheros o flujos de datos. El nombre AWK deriva de los apellidos de los autores: Alfred Aho, Peter Weinberger, y Brian Kernighan. awk, cuando está escrito todo en minúsculas, hace referencia al programa de Unix o Plan 9 que interpreta programas escritos en el lenguaje de programación AWK.
AWK es ejemplo de un lenguaje de computación que usa ampliamente el tipo de datos de listas asociadas (es decir, listas indexados por cadenas clave), y expresiones regulares. El poder, brevedad y limitaciones de los programas de AWK y los guiones de sed inspiraron a Larry Wall a escribir Perl. Debido a su densa notación, todos estos lenguajes son frecuentemente usados para escribir programas de una línea.
AWK fue una de las primeras herramientas en aparecer en Unix (en la versión 3) y gano popularidad como una manera de añadir funcionalidad a las tuberías de Unix. La implementación de alguna versión del lenguaje AWK es entandar en casi todo sistema operativo tipo unix moderno. AWK es mencionado en las Single UNIX Specification (especificaciones básicas de unix) como una de las utilidades necesarias de todo sistema operativo Unix. Se pueden instalar implementaciones de AWK en casi todos los demás sistemas operativos.
Estructura de los programas AWK
Generalmente hablando, a AWK se le dan dos piezas de datos: un fichero de órdenes y un fichero primario de entrada. Un fichero de órdenes (que puede ser un fichero real, o puede ser incluido en la invocación de AWK desde la línea de órdenes) contiene una serie de órdenes que le dicen a AWK como procesar el fichero de entrada. El fichero primario de entrada es normalmente texto formateado de alguna manera; puede ser en un fichero real, o puede ser leído por AWK de la entrada estándar (teclado). Un programa AWK típico consiste en una serie de líneas, cada una de la forma:
/patrón/ { acción }
donde patrón es una expresión regular y acción es una orden. La mayoría de las implementaciones de AWK usan expresiones regulares extendidas por defecto. AWK mira a lo largo del fichero de entrada; cuando encuentra una línea que coincide con el "patrón", ejecuta la(s) órdenes(s) indicadas en "acción". Las formas alternativas incluyen:
BEGIN { acción }
Ejecuta las ordenes acción al comienzo de la ejecución, antes de que los datos comienzen a ser procesados.
END { acción }
Similar a la forma previa pero ejecuta las ordenes acción después de que todos los datos son procesados.
/patrón/
Imprime las líneas cualquier línea acorde al patrón.
{ acción }
Ejecuta acción por cada línea en la entrada.
Cada una de estas formas pueden ser incluidas varias veces en un archivo. El fichero es procesado de manera progresiva, entonces si hubiera dos declaraciones "BEGIN", sus contenidos serán ejecutados en orden de aparición. Las declaraciones "BEGIN" y "END" no necesitan estar en forma ordenada.
AWK fue creado como un reemplazo a los algoritmos escritos en C para métodos de análisis de texto.
Comandos de AWK
Los comandos de AWK son las declaraciones sustituidas por acción en los ejemplos anteriores. Los comandos de AWK pueden incluir llamadas a funciones, asignación de variables, calculos, o cualquier combinación de estas. AWK contiene soporte propio para muchas funciones; muchas otras son provistas por las distintas versiones de AWK. Incluso, algunas versiones soportan la inclusion de librerias dinámicamente enlazadas, que pueden proveer aun más funciones.
Por claridad los corchetes ( { } ) serán omitidos en los siguientes ejemplos.
El comando print
El comando print es usado para imprimir texto. La forma más simple de este comando es
print
Esto muestra el contenido de la línea actualmente procesada. En AWK las líneas son divididas en campos, y estos pueden ser operados individualmente:
print $1
Muestra el primer campo de la línea actual
print $1, $3
Muestra el primer y tercer campo de la línea actual, separados por una cadena predefinida, separador de campos de salida o OFS (por sus siglas en inglés), cuyo valor predefinido es un caracter de espacio (' ').
Aunque esta sintaxis ($#) puede sugerir que se traten de variables (el símbolo $ es indicador de variables en otros lenguajes), hacen referencia a los campos de la línea actual. Un caso especial, $0, se refiere a la línea entera. De hecho, los comandos "print" y "print $0" resultan similares.
El comando print puede también imprimir el resultado de calculos o funciones invocadas:
print 3+2
print foobar(3)
print foobar(variable)
print sin(3-2)
La salida puede ser enviada a un archivo:
print "expresión" > "nombre de archivo"
Variables:
Los nombres de variables pueden usar cualquier combinación de los caracteres [A-Za-z0-9_], con la única excepción de las palabras clave del lenguaje. Los operadores + - * / son suma, resta, multiplicación y división respectivamente. Para la concatenación, basta con colocar dos variables (o cadena constante) junto a cualquier otra, opcionalmente con un espacio intermedio. Las cadenas son delimitadas por comillas dobles. No es necesario finalizar las ordenes con punto y coma. Se pueden añadir comentarios del programa usando # como primer caracter en una línea.
AWK, versiones e implementaciones:
AWK fue escrito originalmente en 1977 con UNIX. En 1985 los autores comienzan la expansión del lenguaje, añadiendo funciones definidas por el usuario. El lenguaje es descrito en el libro The AWK Programming Language, publicado en 1988. Para evitar confusiones con la versión anterior, a la que era incompatible, esta versión se conoce, a veces, como "nuevo AWK" o "nawk". Esta implementación fue liberada bajo una licencia de software libre en 1996, continua siendo mantenida por Brian Wilson Kernighan.
GNU awk, o gawk, es otra implementación libre. Fue escrita antes de que la implementación original fuera liberada, y es ampliamente usada. Casi todas las distribución linux incluyen una versión actualizada de gawk y gawk es reconocido como la implementación estándar en el mundo linux. La versión 30. de GAWK fue incluida como awk en la versión 5.0 de FreeBSD. Las versiones posteriores de BSD incluyeron nawk para evitar el uso de las GPL, unas licencias de software libre mas restrictivas que las BSD en el sentido de que un programa liberado bajo la licencia GPL no puede ser modificado para convertirse en propietario. |