AWK

AWK
AWK
Información general
Paradigma Programación dirigida por eventos, Programación imperativa
Apareció en 1977, última revision 1985, la versión POSIX actual es IEEE Std 1003.1-2004
Diseñado por Alfred Aho, Tipo de dato débil, dinámico
Implementaciones awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (compilador), Awka (compilador)
Dialectos old awk oawk 1977, new awk nawk 1985, GNU Awk
Influido por C, Bourne shell, SNOBOL
Ha influido a Perl, Korn shell(ksh93, dtksh, tksh), JavaScript
Sistema operativo Multiplataforma

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, Unix o Plan 9 que interpreta programas escritos en el lenguaje de programación AWK.

AWK es ejemplo de un lenguaje de programación que usa ampliamente el tipo de datos de listas asociativas (es decir, listas indexadas 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 ganó 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 estándar 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.

Contenido

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 cómo 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 órdenes acción al comienzo de la ejecución, antes de que los datos comiencen a ser procesados.
END { acción }
Similar a la forma previa pero ejecuta las órdenes acción después de que todos los datos sean procesados.
/patrón/
Imprime las líneas acordes 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, cálculos, 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 inclusión de librerías dinámicamente enlazadas, que pueden proveer aún más funciones.

Por claridad las llaves ({ }) serán omitidas 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 carácter 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 cálculos 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 órdenes con punto y coma. Se pueden añadir comentarios del programa usando # como primer carácter en una línea.

Funciones definidas por el usuario

De manera similar a C, la definición de funciones consiste en la clave function, el nombre de la función, los argumentos de la función y el cuerpo de la misma, e.g.:

function:
 
 function sumar_tres (número, temporal) {    # Los identificadores no contienen la letra ñ
   temporal = número + 3                       # Tampoco pueden tener acentos
   return temporal
 }

Podemos invocar la función así:

print sumar_tres(36)     # Imprime 39

Las funciones pueden tener variables definidas localmente. Los nombres de estas son añadidos al final de la lista de argumentos, aunque los valores de estas deben ser omitidos al llamar la función. Es conveniente indentar las variables locales en la lista de argumentos para indicar dónde terminan los parámetros y dónde comienzan las variables locales.

Ejemplos

Hello World

Este es un programa "Hola mundo" muy simple escrito en AWK:

 BEGIN { print "Hola mundo!"; exit }

Imprimir líneas mayores a 80 caracteres

Imprime todas las líneas con más de 80 caracteres. Nótese que la acción por defecto es imprimir la línea actual.

 length > 80

Contador de palabras

Cuenta las palabras en la entrada y muestra la cantidad de líneas, palabras y caracteres.

 { w += NF; c += length}
 END { print NR, w, c }

Total de la primera columna

Suma los valores de la primera columna de los datos ingresados.

 { s += $1 }
 END { print s }

Frecuencia de palabras

Este programa usa listas enlazadas para determinar la cantidad de veces que cada palabra aparece en el texto.

 BEGIN { FS="[^a-zA-Z]+"}
 
 { for (i=1; i<=NF; i++)
      words[tolower($i)]++
 }
 
 END { for (i in words)
     print i, words[i]
 }

Programas autocontenidos

Como cualquier otro lenguaje de programación, se pueden escribir programas AWK autocontenidos usando la sintaxis de líneas de Shebang.

Por ejemplo, un comando UNIX llamado holamundo.awk que imprima el texto "Hola mundo!" podría ser escrito de la siguiente manera:

 #!/usr/bin/awk -f
 BEGIN { print "Hello, world!"; exit }

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 publicada bajo una licencia de software libre en 1996, continúa 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 publicada, y es ampliamente utilizada. 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 más restrictivas que las BSD en el sentido de que un programa publicado bajo la licencia GPL no puede ser modificado para convertirse en propietario protegiendo de esta forma la libertad del código fuente.

Página de un proyecto libre basado en gawk. Este extiende las funcionalidades de gawk para permitirle el uso de librerías dinámicas.

  • mawk es una implementación AWK optimizada para la velocidad, escrita por Mike Brennan y basada en un intérprete bytecode.
  • Thompson AWK o TAWK es un compilador AWK para DOS y Windows, previamente vendido por Thompson Automation Software.
  • Jawk es un proyecto que implementa AWK en Java. Se añaden extensiones para el lenguaje para proveer acceso a características de Java dentro de los programas AWK (e.g., Java threads, sockets, Collections, etc).

Digresión

  • El ave, emblema de AWK (a.o en la cubierta del libro The AWK Programing Language es el Alca).

Libros

Véase también

  • sed
  • Lista de programas para Unix

Enlaces externos

Implementaciones


Wikimedia foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Mira otros diccionarios:

  • awk — ist eine Programmiersprache (Skriptsprache) zur Bearbeitung und Auswertung strukturierter Textdaten, beispielsweise CSV Dateien. Der zugehörige Interpreter war eines der ersten Werkzeuge, das in der Version 3 von Unix erschien; es wird auch… …   Deutsch Wikipedia

  • Awk — Pour les articles homonymes, voir Awk (homonymie). awk dont le nom vient des trois créateurs, Alfred Aho, Peter Weinberger et Brian Kernighan est un langage de traitement de lignes, disponible sur la plupart des systèmes Unix et sous Windows avec …   Wikipédia en Français

  • AWK — Класс языка: скриптовый, процедурный, событийно ориентированный Появился в: 1977 Автор(ы): Альфред Ахо, Питер Вайнбергер и Брайан Керниган Релиз …   Википедия

  • AWK — es un lenguaje de programación de propósito general que fue 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 V. Aho, Peter J. Weinberger, y Brian W.… …   Enciclopedia Universal

  • Awk — ([add]k), a. [OE. auk, awk (properly) turned away; (hence) contrary, wrong, from Icel. [ o]figr, [ o]fugr, afigr, turning the wrong way, fr. af off, away; cf. OHG. abuh, Skr. ap[=a]c turned away, fr. apa off, away + a root ak, a[u^]k, to bend,… …   The Collaborative International Dictionary of English

  • awk — awk·ward; awk·ward·ly; awk·ward·ness; awk; …   English syllables

  • Awk — Awk, adv. Perversely; in the wrong way. L Estrange. [1913 Webster] …   The Collaborative International Dictionary of English

  • AWK —   [Abk. für Aho, Weinberger, Kernighan (die Namen der Entwickler)], eine 1977 entwickelte einfache Programmiersprache, die es ermöglicht unter Unix Textdateien nach bestimmten Textmustern zu durchsuchen und nach zuvor festgelegten Kriterien zu… …   Universal-Lexikon

  • awk — (adj.) mid 15c., turned the wrong way, from O.N. afugr turned backwards, wrong, contrary, from P.Gmc. *afug , from PIE *apu ko , from root *apo off, away (see APO (Cf. apo )). Obsolete since 17c …   Etymology dictionary

  • AWK — (Aho Weinberger Kernighan) programming language included with the UNIX operating system that is designed for processing text files (the name is made from the initials of the three inventors) …   English contemporary dictionary

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”