.\" .\" Translated 13 Jan 1998 by Juan José López Mellado .\" (laveneno@hotmail.com) .\" .ds PX \s-1POSIX\s+1 .ds UX \s-1UNIX\s+1 .ds AN \s-1ANSI\s+1 .TH GAWK 1 "19 Dic 1996" "Free Software Foundation" "Órdenes de Utilidad" .SH NOMBRE gawk \- lenguaje de análisis y procesamiento de patrones .SH SINOPSIS .B gawk [ opciones del estilo POSIX o GNU ] .B \-f .I fichero-de-programa [ .B \-\^\- ] fichero .\^.\^. .br .B gawk [ opciones del estilo POSIX o GNU ] [ .B \-\^\- ] .I texto-del-programa fichero .\^.\^. .SH DESCRIPCIÓN .I Gawk es la implementación del Proyecto GNU del lenguaje de programación AWK. Está conforme con la definición del lenguaje en el \*(PX 1003.2 Command Language And Utilities Standard. Esta versión está basada, a su vez, en la descripción de .IR "The AWK Programming Language" , escrito por Aho, Kernighan, y Weinberger, con las características adicionales que aparecen en la versión del System V de \*(UX .IR awk . .I Gawk igualmente provee de las recientes extensiones del .I awk de Bell Labs, y algunas extensiones específicas de GNU. .PP La línea de orden consiste en opciones para el propio .I gawk , el texto del programa AWK (si no se provee mediante las opciones .B \-f o .B \-\^\-file ), y los valores que deben estar disponibles en las variables predefinidas de AWK .B ARGC y .B ARGV . .SH FORMATO DE LAS OPCIONES .PP Las opciones de .I Gawk pueden seguir tanto el estilo tradicional de opciones de una letra de \*(PX , como el estilo GNU de opciones largas. Las opciones \*(PX comienzan con un solo ''\-'', mientras que las opciones largas lo hacen con ''\-\^\-''. Se ofrecen opciones largas tanto para las características específicas de GNU como para las características definidas por \*(PX. .PP Siguiendo el estándar \*(PX, las opciones específicas de .IR gawk se proveen vía argumentos con la opción .B \-W . Pueden añadirse múltiples opciones .B \-W . Cada una de las opciones .B \-W tienen su correspondiente opción larga, tal y como de detalla más adelante. Los argumentos de las opciones largas deben estar unidas a la opción mediante un signo .B = , sin espacios en blanco, o pueden proveerse en el siguiente argumento de la línea de orden. Las opciones largas pueden ser abreviadas, siempre y cuando la abreviatura sea única. .SH OPCIONES .PP .I Gawk acepta las siguientes opciones. .TP .PD 0 .BI \-F " fs" .TP .PD .BI \-\^\-field-separator " fs" Use .I fs para definir el separador de campos de la entrada (el valor de la variable predefinida .B FS ). .TP .PD 0 \fB\-v\fI var\fB\^=\^\fIval\fR .TP .PD \fB\-\^\-assign \fIvar\fB\^=\^\fIval\fR Asigna el valor .IR val , a la variable .IR var , antes de que la ejecución del programa comience. Estos valores de variable están disponibles en el bloque .B BEGIN de un programa AWK. .TP .PD 0 .BI \-f " fichero-de-programa" .TP .PD .BI \-\^\-file " fichero-de-programa" Leer el fuente del programa AWK del fichero .IR fichero-de-programa , en vez de obtenerlo del primer argumento de la línea de orden. Pueden usarse múltiples opciones .B \-f (o .BR \-\^\-file ). .TP .PD 0 .BI \-mf " NNN" .TP .PD .BI \-mr " NNN" Definir varios límites de memoria al valor .IR NNN . El indicador .B f define el máximo número de campos, y el indicador .B r define el tamaño máximo de un registro. Estos dos indicadores y la opción .B \-m son de la versión de .IR awk para \*(UX de la versión de investigación de Bell Labs. Son ignoradas por .IR gawk , ya que .I gawk no tiene límites predefinidos. .TP .PD 0 .B "\-W traditional" .TP .PD 0 .B "\-W compat" .TP .PD 0 .B \-\^\-traditional .TP .PD .B \-\^\-compat Ejecutar en el modo de .I compatibilidad . En este modo de funcionamiento, .I gawk funciona de manera idéntica al .IR awk de \*(UX ; ninguna de las extensiones específicas de GNU son reconocidas. Es preferible el uso de la forma .B \-\^\-traditional en vez de las otras formas de esta opción. Vea .BR "EXTENSIONES DE GNU" , más adelante, para más información. .TP .PD 0 .B "\-W copyleft" .TP .PD 0 .B "\-W copyright" .TP .PD 0 .B \-\^\-copyleft .TP .PD .B \-\^\-copyright Imprime una versión corta del mensaje de información sobre derechos de copia de GNU en la salida estándar, y termina de forma correcta. .TP .PD 0 .B "\-W help" .TP .PD 0 .B "\-W usage" .TP .PD 0 .B \-\^\-help .TP .PD .B \-\^\-usage Imprime un resumen relativamente corto de las opciones disponibles por la salida estándar. (Siguiendo los .IR "GNU Coding Standards" , estas opciones causan una salida satisfactoria inmediata.) .TP .PD 0 .B "\-W lint" .TP .PD .B \-\^\-lint Genera mensajes de advertencia sobre construcciones que son dudosas o no portables para otras implementaciones de AWK. .TP .PD 0 .B "\-W lint\-old" .TP .PD .B \-\^\-lint\-old Genera mensajes de advertencia sobre construcciones que no son portables a la versión original de Unix. .IR awk . .ig .\" Esta opción se ha dejado indocumentada a propósito. .TP .PD 0 .B "\-W nostalgia" .TP .PD .B \-\^\-nostalgia Provee de un momento de nostalgia para los viejos usuarios de .I awk . .. .TP .PD 0 .B "\-W posix" .TP .PD .B \-\^\-posix Esta opción activa el modo de .I compatibilidad , con las siguientes restricciones adicionales: .RS .TP \w'\(bu'u+1n \(bu .B \ex las secuencias de escape no son reconocidas. .TP \(bu Solo los espacios y los tabuladores actúan como separadores de campo cuando .B FS contiene un único espacio, y no los saltos de línea. .TP \(bu El sinónimo .B func para la palabra clave .B function no es reconocido. .TP \(bu Los operadores .B ** y .B **= no pueden ser usados en vez de .B ^ y .BR ^= . .TP \(bu La función .B fflush() no está disponible. .RE .TP .PD 0 .B "\-W re\-interval" .TP .PD .B \-\^\-re\-interval Activa el uso de las .I "expresiones de intervalos" en el ajuste de expresiones regulares (vea .BR "Expresiones Regulares" , más adelante). Las expresiones de intervalos no eran soportadas tradicionalmente por el lenguaje AWK. El estándar POSIX las añadió, para hacer que .I awk y .I egrep fueran consistentes entre ellos. De cualquier modo, es probable que su uso entorpezca el uso de programas AWK antiguos, por este motivo .I gawk solo las provee si son pedidas mediante esta opción, o si se ha especificado .B \-\^\-posix . .TP .PD 0 .BI "\-W source " texto-del-programa .TP .PD .BI \-\^\-source " texto-del-programa" Usar .I program-text como el código fuente del programa AWK. Esta opción permite la fácil mezcla de funciones de librería (usadas mediante las opciones .B \-f y .B \-\^\-file ) con código fuente entrado por la línea de orden. Se ha propuesto primordialmente como un medio para agrandar programas AWK usados en scripts de shell. .TP .PD 0 .B "\-W version" .TP .PD .B \-\^\-version Imprime información sobre la versión de esta copia de .I gawk en particular por la salida estándar. Es útil principalmente para saber si la copia actual de .I gawk en su sistema está al día respecto con cualquier cosa que la Free Software Foundation esté distribuyendo. También es útil para dar avisos sobre fallos. (Siguiendo los .IR "GNU Coding Standards" , estas opciones causan una salida satisfactoria inmediata.) .TP .B \-\^\- Señala el final de las opciones. Es útil para permitir que los futuros argumentos al propio programa AWK puedan comenzar también por un ``\-''. Esto es principalmente para mantener la consistencia con las convenciones de análisis de argumentos usados por la mayoría de los restantes programas \*(PX. .PP En el modo compatibilidad, cualquier otra opción será marcada como ilegal, aunque sean ignoradas. En operación normal, mientras el texto del programa haya sido incluido, las opciones no reconocidas son pasadas al programa AWK en la tabla .B ARGV para ser procesadas. Es particularmente útil para ejecutar programas AWK mediante el mecanismo de intérprete de ejecutables ''#!''. .SH EJECUCIÓN DE UN PROGRAMA AWK .PP Un programa AWK consiste en una secuencia de sentencias tipo patrón-acción y definiciones de función opcionales. .RS .PP \fIpatrón\fB { \fIsentencias de acción\fB }\fR .br \fBfunction \fInombre\fB(\fIlista de parámetros\fB) { \fIsentencias\fB }\fR .RE .PP .I Gawk primero lee el fuente del programa a partir de los .IR fichero(s)-de-programa si se han especificado, a partir de los argumentos de .BR \-\^\-source , o a partir del primer argumento que no sea una opción de la línea de orden. Las opciones .B \-f y .B \-\^\-source pueden ser usadas más de una vez en una línea de orden. .I Gawk leerá el texto del programa como si todos los .IR fichero(s)-de-programa y textos fuentes de la línea de orden hubieran sido concatenados. Esto es útil para construir librerías de funciones AWK, sin tener la necesidad de incluirlos en cada uno de los nuevos programas AWK que las use. Además ofrece la capacidad de mezclar funciones de librería con programas de la línea de orden. .PP La variable de entorno .B AWKPATH especifica un camino de búsqueda para ser usado cuando se busque los ficheros indicados con la opción .B \-f . Si esta variable no existiera, el camino por defecto sería \fB".:/usr/local/share/awk"\fR. (El directorio actual puede variar, dependiendo de desde donde se compiló e instaló .I gawk .) Si un fichero dado a la opción .B \-f contiene un carácter ''/'', no se realiza ningún tipo de búsqueda. .PP .I Gawk ejecuta los programas AWK en el siguiente orden. Primero, todas las asignaciones de variables especificadas mediante la opción .B \-v se realizan. A continuación, .I gawk compila el programa en un formato interno. Después, .I gawk ejecuta el código del/los bloque(s) .B BEGIN (si existe alguno), y a continuación procede a leer cada uno de los ficheros nombrados en la tabla .B ARGV . Si no existe ningún nombre de fichero en la línea de orden, .I gawk lee de la entrada estándar. .PP Si el nombre de un fichero en la línea de orden tiene la forma .IB var = val será tratado como una asignación de variable. Se asignará a la variable .I var el valor .IR val . (Esto ocurre después de que cualquier bloque(s) .B BEGIN haya sido ejecutado.) Las asignaciones en la línea de orden es útil sobre todo para asignar valores de forma dinámica a las variables que AWK usa para controlar cómo es troceada la entrada en campos y registros. Es también útil para controlar el estado si son necesarios múltiples pasos sobre el mismo fichero de datos. .PP Si el valor de alguno de los elementos particulares de .B ARGV está vacío (\fB""\fR), .I gawk se lo salta. .PP Para cada registro de la entrada, .I gawk prueba si es posible ajustarlo con alguno de los .I patrones en el programa AWK. Para cada patrón con el cual el registro concuerde, se ejecuta la .I acción asociada. Los patrones son probados en el orden en que aparecen en el programa. .PP Finalmente, después de que toda la entrada se ha terminado, .I gawk ejecuta el código en el/los bloque(s) .B END (si existiera alguno). .SH VARIABLES, REGISTROS Y CAMPOS Las variables AWK son dinámicas; su existencia comienza cuando son usadas por primera vez. Sus valores son números de coma flotante o cadenas de caracteres, o ambos, dependiendo de cómo son usadas. AWK también dispone de tablas unidimensionales; las tablas multidimensionales pueden ser simuladas. Varias variables predefinidas se definen cuando un programa comienza a ejecutarse; serán descritas cuando convenga y serán resumidas más adelante. .SS Registros Normalmente, los registros se separan por caracteres de salto de línea. Puede controlar cómo son separados los registros asignando valores a la variable predefinida .BR RS . Si .B RS tiene un único carácter, ese carácter separará los registros. De otro modo, .B RS se considerará como una expresión regular. El texto de la entrada que concuerde con esa expresión regular será el que separará los registros. De todas maneras, en el modo compatibilidad, solo el primer carácter de esa cadena será usado para separar registros. Si .B RS contiene la cadena vacía, entonces los registros serán separados por espacios en blanco. Cuando .B RS contiene la cadena vacía, el carácter de salto de línea siempre actúa como separador de campos, añadiéndose a cualquier valor que .B FS pudiera tener. .SS Campos .PP Conforme cada registro de entrada es leído, .I gawk divide el registro en .IR campos , usando el valor de la variable .B FS como separados de campos. Si .B FS tiene un único carácter, los campos serán separados por ese carácter. Si .B FS contiene la cadena vacía, entonces cada carácter individual se convierte en separador de campo. De otro modo, se espera que .B FS sea una expresión regular completa. En el caso especial de que .B FS tuviera un único espacio en blanco, los campos serían separados por tiras de espacios y/o tabuladores y/o saltos de línea. (Vea la discusión sobre .BR \-\-posix , más adelante). Nótese que el valor de .B IGNORECASE (vea más adelante) afectará también a cómo son divididos los registros en el caso de que .B FS fuera una expresión regular, y a cómo son separados cuando .B RS fuera una expresión regular. .PP Si la variable .B FIELDWIDTHS está definida como una lista de número separados por espacios, se espera que cada campo tenga ancho fijo, y .I gawk dividiría el registro usando los anchos especificados. El valor de .B FS es ignorado es este caso. Asignar un nuevo valor a .B FS haría saltarse el uso de .BR FIELDWIDTHS , y volver a la forma de actuar por defecto. .PP Cada campo en el registro de entrada puede ser referenciado por su posición, .BR $1 , .BR $2 , etc. .B $0 es el registro completo. El valor de un campo puede ser también asignado. Los campos no necesitan ser referenciados por constantes: .RS .PP .ft B n = 5 .br print $n .ft R .RE .PP imprime el quinto campo del registro de entrada. La variable .B NF se define con el número total de campos en el registro de entrada. .PP Las referencias a campos que no existen (por ejemplo los campos por detrás de .BR $NF ) producen la cadena vacía. De todas maneras, la asignación de un campo no existente (por ejemplo, .BR "$(NF+2) = 5" ) incrementaría el valor de .BR NF , creando los campos que intervienen como cadenas vacías, y causando que el valor de .B $0 fuera recalculado, siendo separados los campos mediante el valor de .BR OFS . Las referencias a campos con numeración negativa causan un error fatal. Decrementar .B NF causa que el valor de los campos que pasen del nuevo número se pierda, y el valor de .B $0 sea recalculado, siendo separados los campos mediante el valor de .BR OFS . .SS Variables Predefinidas .PP Las variables predefinidas de .IR gawk son: .PP .TP \w'\fBFIELDWIDTHS\fR'u+1n .B ARGC EL número de argumentos en la línea de orden (no incluye las opciones para .IR gawk , o el fuente del programa). .TP .B ARGIND El índice en .B ARGV del fichero que actualmente se está procesando. .TP .B ARGV Tabla con los argumentos de la línea de orden. La tabla está indexada desde el 0 hasta .B ARGC \- 1. Cambiando dinámicamente el contenido de .B ARGV permite controlar los ficheros usados para datos. .TP .B CONVFMT El formato de conversión para números,por defecto \fB"%.6g"\fR. .TP .B ENVIRON Una tabla conteniendo los valores del entorno actual. La tabla se encuentra indexada por el nombre de las variables de entorno, siendo cada elemento el valor para esa variable (por ejemplo, \fBENVIRON["HOME"]\fP podría ser .BR /home/arnold ). Cambiar esta tabla no afecta al entorno de los programas que .I gawk ejecuta vía redirección o la función .B system() . (Esto podría cambiar en una futura versión de .IR gawk .) .\" pero no mantenga la respiración... .TP .B ERRNO Si ocurre algún error de sistema tanto por hacer una redirección con .BR getline , durante una lectura con .BR getline , o durante un .BR close() , entonces .B ERRNO contendrá una cadena de caracteres describiendo el error. .TP .B FIELDWIDTHS Una lista de anchos de campo separados por espacios. Cuando esté definida, .I gawk analiza la entrada como campos de tamaño fijo, en vez de usando el valor de la variable .B FS como separador de campo. La capacidad de trabajar con anchos de campo fijos es todavía experimental; las semánticas podrían cambiar conforme .I gawk se vaya desarrollando en el tiempo. .TP .B FILENAME El nombre del fichero de entrada actual. Si no se ha especificado ningún fichero en la línea de orden, el valor de .B FILENAME será ``\-''. De todos modos, .B FILENAME no está definida dentro de un bloque .B BEGIN . .TP .B FNR El número de registro de entrada en el fichero de entrada actual. .TP .B FS El separador de campo de entrada, un espacio por defecto. Vea .BR Fields , más arriba. .TP .B IGNORECASE Controla la sensibilidad a mayúsculas de todas las expresiones regulares y operaciones con cadenas. Si .B IGNORECASE tiene un valor diferente de cero, entonces las comparaciones entre cadenas y las comprobaciones de patrones en las reglas, la división de campos con .BR FS , la separación de registros con .BR RS , la comprobación de expresiones regulares con .B ~ y .BR !~ , y las funciones predefinidas .BR gensub() , .BR gsub() , .BR index() , .BR match() , .BR split() , y .B sub() ignorarán la diferencia entre minúsculas y mayúsculas cuando realicen operaciones con expresiones regulares. De este modo, si .B IGNORECASE no es igual a cero, .B /aB/ concuerda con todas las cadenas \fB"ab"\fP, \fB"aB"\fP, \fB"Ab"\fP, y \fB"AB"\fP. Como con todas las otras variables de AWK, el valor inicial de .B IGNORECASE es cero, por lo que todas las operaciones con expresiones regulares y cadenas son normalmente sensibles a las mayúsculas. Bajo Unix, el conjunto de caracteres ISO 8859-1 Latin-1 es usado cuando se ignoran las mayúsculas. .B NOTA: En versiones de .I gawk anteriores a la 3.0, .B IGNORECASE solo afectaba a las operaciones con expresiones regulares. Ahora también afecta a las comparaciones de cadenas. .TP .B NF El número de campos en el registro de entrada actual. .TP .B NR El número total de registros de entrada que han aparecido desde el principio. .TP .B OFMT El formato de salida para los números, por defecto es \fB"%.6g"\fR. .TP .B OFS El separador de campos de salida, un espacio por defecto. .TP .B ORS El separador de registros de salida, por defecto un salto de línea. .TP .B RS El separador de registros de entrada, por defecto un salto de línea. .TP .B RT El terminador de los registros. .I Gawk define .B RT con el texto de entrada que concordó con el carácter o expresión regular especificada por .BR RS . .TP .B RSTART El índice del primer carácter concordado por .BR match() ; 0 si no concordó ninguno. .TP .B RLENGTH La longitud de la cadena concordada por .BR match() ; \-1 si no concordó ninguna. .TP .B SUBSEP El carácter usado para separar múltiples subíndices en elementos de tipo tabla, por defecto \fB"\e034"\fR. .\" .\" The character used to separate multiple subscripts in array .\" elements, by default \fB"\e034"\fR. .\" .SS Tablas .PP Las tablas se indexan mediante una expresión entre corchetes .RB ( [ " y " ] ). Si la expresión es una lista de expresiones .RI ( expr ", " expr " ...)" entonces el índice de la tabla es una cadena de caracteres resultado de la concatenación de los valores (cadenas) de cada una de las expresiones, separados por el valor de la variable .B SUBSEP . Esta capacidad se utiliza para simular tablas de múltiples dimensiones. Por ejemplo: .PP .RS .ft B i = "A";\^ j = "B";\^ k = "C" .br x[i, j, k] = "hola, mundo\en" .ft R .RE .PP asigna la cadena \fB"hola, mundo\en"\fR al elemento de la tabla .B x que está indexado por la cadena \fB"A\e034B\e034C"\fR. Todas las tablas en AWK son asociativas, es decir, indexadas por valores de tipo cadena. .PP El operador especial .B in puede ser usado en las órdenes .B if o .B while para comprobar si una tabla contiene un índice consistente en un valor particular. .PP .RS .ft B .nf if (val in tabla) print tabla[val] .fi .ft .RE .PP Si la tabla tiene múltiples subíndices, use .BR "(i, j) in tabla" . .PP La construcción .B in también puede usarse en bucles de tipo .B for para iterar sobre todos los elementos de una tabla. .PP Un elemento puede ser eliminado de una tabla usando la orden .B delete . La orden .B delete puede ser usada también para borrar completamente los contenidos de una tabla, simplemente especificando el nombre de la tabla sin ningún índice. .SS Tipado de Variables y Conversiones .PP Las variables y los campos pueden ser números (de coma flotante), o cadenas de caracteres, o ambos. Dependerá del contexto cómo será interpretado el valor de una variable. Si se usa en una expresión numérica, será tratado como número, si se usa como una cadena será tratada como una cadena. .PP Para forzar que una variable sea tratada como un número, sumele un 0; para forzar que sea tratada como una cadena, concaténela con la cadena vacía. .PP Cuando una cadena debe ser convertida a número, la conversión se realiza usando .IR atof (3). Un número es convertido en cadena usando el valor de .B CONVFMT como cadena de formato para .IR sprintf (3), con el valor numérico de la variable como el argumento. De todas maneras, aunque todos los números en AWK son reales de coma flotante, los valores enteros son .I siempre convertidos como enteros. De tal manera que, dados .PP .RS .ft B .nf CONVFMT = "%2.2f" a = 12 b = a "" .fi .ft R .RE .PP la variable .B b contendrá el valor de tipo cadena \fB"12"\fR y no \fB"12.00"\fR. .PP .I Gawk realiza comparaciones tal y como sigue: Si dos variables son numéricas, son comparadas numéricamente. Si un valor es numérico y el otro tiene un valor de tipo cadena que es un ``cadena numérica'', entonces las comparaciones se hacen numéricamente. En otro caso, el valor numérico es traducido a cadena y se comparan en forma de cadena. Dos cadenas se comparan, por supuesto, en forma de cadena. De acuerdo con el estándar \*(PX, si dos cadenas fueran cadenas numéricas debería realizarse una comparación numérica. De todas maneras, esto es claramente incorrecto, y .I gawk no lo hace así. .PP Nótese que las constantes de tipo cadena, como \fB"57"\fP, .I no son cadenas numéricas, sino constantes de cadena. La idea de ``cadena numérica'' solo se aplica a los campos, entradas con .B getline , los elementos de .BR FILENAME y .B ARGV , elementos de .B ENVIRON y los elementos de una tabla creada mediante .B split() que son cadenas numéricas. La idea básica es que las .IR "entradas de usuario" , y solo las entradas de usuario, que parezcan numéricas, serán tratadas de esta manera. .PP Las variables sin inicializar tendrán el valor numérico 0 y la cadena "" (cadena nula o vacía). .SH PATRONES Y ACCIONES AWK es un lenguaje orientado a la línea. Primero se indica el patrón, y luego la acción. Las sentencias de las acciones se engloban mediante .B { y .BR } . Puede no indicarse el patrón o la acción, pero por supuesto, no ambos. Si no se especifica el patrón, la acción será ejecutada por cada uno de los registros individuales de la entrada. Si no se especifica la acción es equivalente a escribir la acción .RS .PP .B "{ print }" .RE .PP la cual imprime el registro completo. .PP Los comentarios comienzan con el carácter ``#'', y continúan hasta el final de la línea. Pueden usarse líneas en blanco para separar sentencias. Normalmente, una sentencia termina con un salto de línea, aunque este no es el caso de las líneas que finalizan con un ``,'', .BR { , .BR ? , .BR : , .BR && , o .BR || . Las líneas que terminan con .B do o .B else también se considera que continúan en la siguiente línea. En otros casos, una línea podrá ser continuada en la siguiente poniendo al final un ``\e'', en cuyo caso se ignorará el salto de línea. .PP Se pueden poner múltiples sentencias en la misma línea separándolos mediante un ``;''. Esto se aplica tanto para las sentencias que componen la parte de la acción de un par patrón-acción (el caso más usual), como para las propias sentencias patrón-acción. .SS Patrones Los patrones de AWK pueden ser uno de los siguientes: .PP .RS .nf .B BEGIN .B END .BI / "expresión regular" / .I "expresión relacional" .IB patrón " && " patrón .IB patrón " || " patrón .IB patrón " ? " patrón " : " patrón .BI ( patrón ) .BI ! " patrón" .IB patrón1 ", " patrón2 .fi .RE .PP .B BEGIN y .B END son dos patrones de tipo especial que no son utilizados para comprobarlos contra la entrada. Las acciones de todos los patrones .B BEGIN se juntan como si todas las sentencias hubieran sido escritas en un único bloque .B BEGIN . Son ejecutadas antes de que se lea algo de la entrada. De forma análoga, todos los bloques .B END se juntan, y son ejecutados cuando se ha agotado toda la entrada (o cuando se ejecuta una sentencia .B exit ). Los patrones .B BEGIN y .B END no pueden ser combinados con otros patrones en expresiones de patrón. Los patrones .B BEGIN y .B END no pueden tener vacía la parte de la acción. .PP Para los patrones con .BI / "expresiones regulares" / , la sentencia asociada se ejecuta para cada registro de entrada que concuerde con la expresión regular. Las expresiones regulares son las mismas que las usadas en .IR egrep (1), y se encuentran resumidas más adelante. .PP Una .I "expresión relacional" puede usar cualquiera de los operadores definidos en la parte de acciones de esta sección. Estas generalmente comprueban si ciertos campos concuerdan con una cierta expresión regular. .PP Los operadores .BR && , .BR || , y .B ! son respectivamente la Y lógica, la O lógica, y la NO lógica, como en C. Hacen evaluaciones de circuito corto, también como en C, y se usan para combinar varias expresiones de patrón primitivas. Como en la mayoría de los lenguajes, pueden usarse paréntesis para cambiar el orden de la evaluación. .PP El operador .B ?\^: es igual que el mismo operador en C. Si el primer patrón es cierto el patrón usado para las comprobaciones es el segundo, en caso contrario es el tercero. De entre el segundo y el tercer patrón, solo es evaluado uno de ellos. .PP La forma .IB patrón1 ", " patrón2 para una expresión recibe el nombre de .IR "rango de patrones" . Concuerda con todos los registros de la entrada que existan entre el registro que concuerde con .IR patrón1 , y el registro que concuerde con .IR patrón2 , inclusive. No combina con ningún otro tipo de expresión de patrón. .SS Expresiones Regulares Las expresiones regulares corresponden con el tipo extendido usado en .IR egrep . Están compuestas por caracteres como sigue: .TP \w'\fB[^\fIabc...\fB]\fR'u+2n .I c concuerda con el carácter .IR c (no metacarácter). .TP .I \ec concuerda con el carácter literal .IR c . .TP .B . concuerda con cualquier carácter .I incluyendo el salto de línea. .TP .B ^ concuerda con el principio de una cadena. .TP .B $ concuerda con el fin de una cadena. .TP .BI [ abc... ] lista de caracteres, concuerda con cualquiera de los caracteres .IR abc... . .TP .BI [^ abc... ] lista negada de caracteres, concuerda con cualquier carácter excepto .IR abc... . .TP .IB r1 | r2 alternativa: concuerda con .I r1 o .IR r2 . .TP .I r1r2 concatenación: concuerda con .IR r1 , y después con .IR r2 . .TP .IB r + concuerda con una o más apariciones de .IR r . .TP .IB r * concuerda con cero o más apariciones de .IR r . .TP .IB r ? concuerda con cero o una aparición de .IR r . .TP .BI ( r ) agrupación: concuerda con .IR r . .TP .PD 0 .IB r { n } .TP .PD 0 .IB r { n ,} .TP .PD .IB r { n , m } Uno o dos números entre llaves denotan una .IR "expresión de intervalo" . Si hay un número entre llaves, la expreg. precedente .I r se repite .I n veces. Si hay dos números separados por una coma, .I r se repite de .I n a .I m veces. Si hay un número seguido de una coma, entonces .I r se repite como mínimo .I n veces. .sp .5 Las expresiones de intervalo solo están disponibles si se especifica .B \-\^\-posix o .B \-\^\-re\-interval en la línea de orden. .TP .B \ey concuerda con la cadena vacía tanto en el principio como en el final de una palabra. .TP .B \eB concuerda con la cadena vacía dentro de una palabra. .TP .B \e< concuerda con la cadena vacía al principio de una palabra. .TP .B \e> concuerda con la cadena vacía al final de una palabra. .TP .B \ew concuerda con cualquier carácter constitutivo de palabra (letra, dígito, o subrayado.) .TP .B \eW concuerda con cualquier carácter que no es constitutivo de palabra. .TP .B \e` concuerda con la cadena vacía al principio de un búfer (cadena). .TP .B \e' concuerda con la cadena vacía al final de un búfer. .PP Las secuencias de escape que son válidas en las constantes de cadena (vea abajo) son también legales en las expresiones regulares. .PP Las .I "clases de caracteres" son una nueva característica introducida en el estándar POSIX. Una clase de caracteres es una notación especial para describir listas de caracteres que tienen un atributo específico, pero donde los caracteres en sí mismos pueden variar entre países diferentes y/o entre juegos de caracteres diferentes. Por ejemplo, la noción de lo que es un carácter alfanumérico difiere entre los EEUU y Francia. .PP Una clase de caracteres solo es válida en una expreg .I dentro de las llaves de una lista de caracteres. Las clases de caracteres consisten en .BR [: , una palabra clave que denota la clase, y .BR :] . Estas son las clases de caracteres definidas por el estándar POSIX. .TP .B [:alnum:] Caracteres alfanuméricos. .TP .B [:alpha:] Caracteres alfabéticos. .TP .B [:blank:] Espacio en blanco o tabulador. .TP .B [:cntrl:] Caracteres de control. .TP .B [:digit:] Caracteres numéricos. .TP .B [:graph:] Caracteres que son imprimibles y visibles al mismo tiempo. (Un espacio en blanco es imprimible, pero no visible, mientras que una .B a es las dos cosas.) .TP .B [:lower:] Caracteres alfabéticos en minúscula. .TP .B [:print:] Caracteres imprimibles (aquellos que no tienen caracteres de control.) .TP .B [:punct:] Caracteres de puntuación (aquellos que no son letras, dígitos, caracteres de control, o caracteres de espaciado.) .TP .B [:space:] Caracteres de espaciado (como el espacio en blanco, el tabulador, y el salto de página, por nombrar algunos.) .TP .B [:upper:] Caracteres alfabéticos en mayúscula. .TP .B [:xdigit:] Caracteres que son dígitos hexadecimales. .PP Por ejemplo, antes del estándar POSIX, para concordar caracteres alfanuméricos, tendría que haber escrito .BR /[A\-Za\-z0\-9]/ . Si su juego de caracteres contiene otros caracteres alfabéticos, esta especificación no los hubiera recogido. Usando las clases de caracteres de POSIX, puede escribir .BR /[[:alnum:]]/ , y esto concordaría con .I todos los caracteres alfabéticos y numéricos de su juego de caracteres. .PP Adicionalmente en las listas de caracteres pueden aparecer dos secuencias especiales. Esto se aplica a los juegos de caracteres no ASCII, los cuales pueden contener símbolos (llamados .IR "elementos equivalentes" ) los cuales son representados por más de un carácter, al igual que varios caracteres que son equivalentes para propósitos de .IR comparación u .IR ordenación. (Por ejemplo, en Español, una ``e'' normal y una con tilde "á" son equivalentes.) .TP Símbolos Equivalentes Un símbolo equivalente es un elemento formado por más de un carácter englobado entre .B [. y .BR .] . Por ejemplo, si .B ch es un elemento equivalente, entonces .B [[.ch.]] es una expresión regular que se ajusta con este elemento equivalente, mientras que .B [ch] es una expresión regular que se ajusta con una .B c o con una .BR h . .TP Clases de Equivalencia Una clase de quivalencia es un nombre (específico para una localización determinada) para una lista de caracteres que son equivalentes. El nombre se engloba entre .B [= y .BR =] . Por ejemplo, el nombre .B e puede ser utilizado para representar a todos estos: ``e,'' ``è,'' y ``é.'' En este caso, .B [[=e]] es una expresión regular que se ajusta con .BR e , .BR è , o .BR é . .PP Estas características son especialmente útiles para las localizaciones de habla no inglesa. Las funciones de librería que usa .I gawk para el ajuste de expresiones regulares solo reconoce las clases de caracteres POSIX; no reconocen ni los símbolos equivalentes ni las clases de equivalencia. .PP Los operadores .BR \ey , .BR \eB , .BR \e< , .BR \e> , .BR \ew , .BR \eW , .BR \e` , y .B \e' son específicos para .IR gawk ; son extensiones basadas en las capacidades de las librerías de expresiones regulares de GNU. .PP Varias opciones de la línea de ordenes controlan cómo .I gawk interpreta los caracteres en las expresiones regulares. .TP Sin opciones En el caso por defecto, .I gawk provee de todas las posibilidades de las expresiones regulares de POSIX y los operadores de expresiones regulares de GNU descritos anteriormente. Aun con todo, no son soportadas las expresiones de intervalo. .TP .B \-\^\-posix Solo se aceptan las expresiones regulares de POSIX, los operadores de GNU no son considerados especiales. (Por ejemplo, .B \ew concuerda con el literal .BR w ). Las expresiones regulares están permitidas. .TP .B \-\^\-traditional Se aceptan las expresiones regulares de la implementación tradicional de .I awk de Unix. Los operadores de GNU no se consideran especiales, no se permiten las expresiones de intervalo, ni tampoco las clases de caracteres de POSIX .RB ( [[:alnum:]] y el resto.) Los caracteres descritos mediante secuencias de escape en octal o hexadecimal son tratados literalmente, incluso si representan metacaracteres de expresiones regulares. .TP .B \-\^\-re\-interval Permiten las expresiones de intervalo en las expresiones regulares, aunque se haya indicado .B \-\^\-traditional . .SS Acciones Las sentencias de las acciones se engloban entre llaves, .B { y .BR } . Las sentencias de las acciones consisten en las habituales sentencias de asignación, condicionales y bucles que pueden encontrarse en la mayoría de los lenguajes. Los operadores, sentencias de control, y sentencias de entrada/salida disponibles son parecidas a las equivalentes de C. .SS Operadores .PP Los operadores en AWK, en orden decreciente de precedencia, son .PP .TP "\w'\fB*= /= %= ^=\fR'u+1n" .BR ( \&... ) Agrupación. .TP .B $ Referencia a campo. .TP .B "++ \-\^\-" Incremento y decremento, tanto en forma prefija como sufija. .TP .B ^ Exponenciación (también puede usarse \fB**\fR , y \fB**=\fR para el operador de asignación.) .TP .B "+ \- !" Más y menos unarios, y negación lógica. .TP .B "* / %" Multiplicación, división, y resto de división. .TP .B "+ \-" Suma y resta. .TP .I space Concatenación de cadenas. .TP .PD 0 .B "< >" .TP .PD 0 .B "<= >=" .TP .PD .B "!= ==" Operadores de relación tradicionales. .TP .B "~ !~" Cotejo de expresión regular, cotejo negado. .B NOTA: No use una expresión regular constante .RB ( /pepe/ ) en la parte izquierda de una .B ~ o una .BR !~ . Sólo usela en la parte derecha. La expresión .BI "/pepe/ ~ " exp tiene el mismo significado que \fB(($0 ~ /foo/) ~ \fIexp\fB)\fR. Esto normalmente .I no es lo que se pretendía. .TP .B in Pertenencia a una tabla. .TP .B && Y lógica. .TP .B || O lógica. .TP .B ?: Expresión condicional de C. Tiene la forma .IB expr1 " ? " expr2 " : " expr3\c \&. Si .I expr1 es cierta, el valor de la expresión es .IR expr2 , en caso contrario es .IR expr3 . Solo uno de los dos ( .I expr2 y .I expr3 ) son evaluados. .TP .PD 0 .B "= += \-=" .TP .PD .B "*= /= %= ^=" Asignación. Tanto las asignaciones absolutas .BI ( var " = " valor ) como las asignaciones de operador (las otras formas) son aceptadas. .SS Sentencias de control .PP Las sentencias de control son las siguientes: .PP .RS .nf \fBif (\fIcondición\fB) \fIsentencia\fR [ \fBelse\fI sentencia \fR] \fBwhile (\fIcondición\fB) \fIsentencia \fR \fBdo \fIsentencia \fBwhile (\fIcondición\fB)\fR \fBfor (\fIexpr1\fB; \fIexpr2\fB; \fIexpr3\fB) \fIsentencia\fR \fBfor (\fIvar \fBin\fI tabla\fB) \fIsentencia\fR \fBbreak\fR \fBcontinue\fR \fBdelete \fItabla\^\fB[\^\fIíndice\^\fB]\fR \fBdelete \fItabla\^\fR \fBexit\fR [ \fIexpresión\fR ] \fB{ \fIsentencias \fB} .fi .RE .SS "Sentencias de E/S" .PP Las sentencias de entrada/salida son las siguientes: .PP .TP "\w'\fBprintf \fIfmt, lista-expr\fR'u+1n" .BI close( fichero ) Cerrar fichero (o tubería, vea más abajo.) .TP .B getline Asignar a .B $0 el siguiente registro de entrada; modifica .BR NF , .BR NR , .BR FNR . .TP .BI "getline <" fichero Asignar a .B $0 el siguiente registro de .IR fichero ; modifica .BR NF . .TP .BI getline " var" Asignar a .I var el siguiente registro de entrada; modifica .BR NR , .BR FNR . .TP .BI getline " var" " <" fichero Asignar a .I var el siguiente registro de .IR fichero . .TP .B next Parar el procesado del registro de entrada actual. Se lee el siguiente registro de entrada y el procesado vuelve a comenzar con el primer patrón del programa AWK. Si se llega al final de los datos de entrada, el/los bloque(s) .B END , si existen, son ejecutados. .TP .B "nextfile" Parar el procesado del fichero de entrada actual. La siguiente lectura de un registro de entrada se obtiene del siguiente fichero de entrada. Se modifican .B FILENAME y .B ARGIND , .B FNR se actualiza a 1, y el procesado comienza de nuevo por el primer patrón del programa AWK. Si se llega al final de los datos de entrada, el/los bloque(s) .B END , si existen, son ejecutados. .B NOTA: Versiones antiguas de gawk usaban .BR "next file" , como dos palabras. Aunque esta forma se reconoce todavía, genera un mensaje de alerta y será eliminado en futuras versiones. .TP .B print Imprime el registro actual. El registro de salida se termina con el valor de la variable .B ORS . .TP .BI print " lista-expr" Imprime expresiones. Cada expresión se separa por el valor de la variable .B OFS . El registro de salida se termina con el valor de la variable .B ORS . .TP .BI print " lista-expr" " >" fichero Imprime expresiones en .IR fichero . Cada expresión se separa por el valor de la variable .B OFS . El registro de salida se termina con el valor de la variable .B ORS . .TP .BI printf " fmt, lista-expr" Dar formato e imprimir. .TP .BI printf " fmt, lista-expr" " >" fichero Dar formato e imprimir en .IR fichero . .TP .BI system( línea-de-orden ) Ejecutar la orden .IR línea-de-orden , y devuelve el valor de salida. (Esto puede no estar disponible en sistemas no \*(PX .) .TP \&\fBfflush(\fR[\fIfichero\^\fR]\fB)\fR Descargar cualquier búfer asociado con el .IR fichero o tubería de salida abierto. Si no se especifica .I fichero , entonces se descarga la salida estándar. Si .I fichero es la cadena vacía, entonces todos los búfers de los ficheros y tuberías de salida abiertos son descargados. .PP También se permiten redirecciones de entrada/salida. Para .B print y .BR printf , .BI >> fichero añade la salida a .IR fichero , mientras que .BI | " orden" escribe en una tubería. De forma similar, .IB orden " | getline" escribe mediante una tubería en .BR getline . La orden .BR getline retornará 0 en el final del fichero, y \-1 en caso de error. .SS La sentencia \fIprintf\fP\^ .PP Las versiones AWK de la sentencia .B printf y de la función .B sprintf() (véase a continuación) aceptan la siguiente especificación para formatos de conversión: .TP .B %c Un carácter \s-1ASCII\s+1 . Si el argumento usado para .B %c es numérico, es tratado como un carácter e imprimido. De otro modo, el argumento se asume que es una cadena, y solo se imprime el primer carácter de esa cadena. .TP .PD 0 .B %d .TP .PD .B %i Un número decimal (la parte entera). .TP .PD 0 .B %e .TP .PD .B %E Un número real de coma flotante de la forma .BR [\-]d.dddddde[+\^\-]dd . El formato .B %E usa .B E en vez de .BR e . .TP .B %f Un número real de coma flotante de la forma .BR [\-]ddd.dddddd . .TP .PD 0 .B %g .TP .PD .B %G Usese la conversión .B %e o .B %f , la que sea más corta, suprimiendo los ceros no significativos. El formato .B %G usa .B %E en vez de .BR %e . .TP .B %o Un número sin signo en octal (entero.) .TP .B %s Una cadena de caracteres. .TP .PD 0 .B %x .TP .PD .B %X Un número sin signo en hexadecimal (entero.) El formato .B %X usa .B ABCDEF en vez de .BR abcdef . .TP .B %% Un carácter .B % ; no se utiliza ningún argumento. .PP Estos son parámetros opcionales que pueden ponerse entre el .B % y la letra de control: .TP .B \- La expresión debe ser justificada por la izquierda dentro de su campo. .TP .I espacio Para conversiones numéricas, pone un espacio en blanco como prefijo en los valores positivos, y un signo negativo en los valores negativos. .TP .B + EL signo más, usado antes del modificador de anchura (vea más adelante), indica que siempre debe ponerse el signo en las conversiones numéricas, aunque el dato a dar formato sea positivo. El .B + anula el modificador de espacio. .TP .B # Usa una ``forma alternativa'' para ciertas letras de control. Para .BR %o , añade un cero inicial. Para .BR %x , y .BR %X , añade un .BR 0x o .BR 0X inicial para resultados diferentes de cero. Para .BR %e , .BR %E , y .BR %f , El resultado contendrá siempre un punto decimal. Para .BR %g , y .BR %G , Los ceros al final no serán eliminados del resultado. .TP .B 0 Un .B 0 (cero) inicial actúa como una bandera, indica que la salida debe ser rellenada con ceros en vez de con espacios. Esto se aplica también para los formatos de salida no numéricos. Esta bandera solo tiene efecto cuando la anchura del campo es mayor que el valor a imprimir. .TP .I anchura El campo tiene que ser rellenado hasta alcanzar la anchura indicada. El campo normalmente será rellenado con espacios. Si la bandera .B 0 se está usando, será rellenado con ceros. .TP .BI \&. prec Un número que especifica la precisión a usar cuando se imprima. Para los formatos .BR %e , .BR %E , y .BR %f , esto especifica el número de dígitos que desea que se impriman a la derecha del punto decimal. Para los formatos .BR %g , y .B %G , especifica el número máximo de dígitos significativos. Para los formatos .BR %d , .BR %o , .BR %i , .BR %u , .BR %x , y .B %X , especifica el número mínimo de dígitos a imprimir. Para una cadena, especifica el número máximo de caracteres de la cadena que deben ser imprimidos. .PP Las características de .I anchura y .I prec dinámicas de las rutinas .B printf() del \*(AN C también son soportadas. Un .B * en el lugar de las especificaciones de .B anchura o de .B prec causará que sus valores sean tomados a partir de la lista de argumentos de .B printf o .BR sprintf() . .SS Nombres especiales de ficheros .PP Cuando se realiza redirección de la E/S tanto desde .B print como de .B printf en un fichero, o mediante .B getline a partir de un fichero, .I gawk reconoce internamente ciertos nombres especiales de ficheros. Estos nombres de ficheros permiten acceder a descriptores de ficheros abiertos heredados del proceso padre de .IR gawk (normalmente el shell.) Otros nombres especiales proveen acceso a información sobre la ejecución del proceso .B gawk . Los nombres de ficheros son: .TP \w'\fB/dev/stdout\fR'u+1n .B /dev/pid Leer de este fichero devuelve el ID del proceso actual, en decimal, terminado con un salto de línea. .TP .B /dev/ppid Leer de este fichero devuelve el ID del proceso padre del actual proceso, en decimal, terminado con un salto de línea. .TP .B /dev/pgrpid Leer de este fichero devuelve el ID del grupo del proceso actual, en decimal, terminado con un salto de línea. .TP .B /dev/user Leer de este fichero devuelve un registro terminado con un salto de línea. Los campos se separan por espacios en blanco. .B $1 el el valor de la llamada a sistema .IR getuid (2) , .B $2 es el valor de la llamada a sistema .IR geteuid (2) , .B $3 es el valor de la llamada a sistema .IR getgid (2) , y .B $4 es el valor de la llamada a sistema .IR getegid (2) . Si hay campos adicionales, son los IDs de grupo devueltos por .IR getgroups (2). No todos los sistemas soportan múltiples grupos. .TP .B /dev/stdin La entrada estándar. .TP .B /dev/stdout La salida estándar. .TP .B /dev/stderr La salida de error estándar. .TP .BI /dev/fd/\^ n El fichero asociado con el descriptor de fichero abierto .IR n . .PP Son particularmente útiles para los mensajes de error. Por ejemplo: .PP .RS .ft B print "¡ Error !" > "/dev/stderr" .ft R .RE .PP donde, de otra manera, tendría que haber usado .PP .RS .ft B print "¡ Error !" | "cat 1>&2" .ft R .RE .PP Estos nombres de fichero pueden usarse también en la línea de orden para nombrar ficheros de datos. .SS Funciones numéricas .PP AWK dispone de las siguientes funciones aritméticas predefinidas: .PP .TP \w'\fBsrand(\fR[\fIexpr\^\fR]\fB)\fR'u+1n .BI atan2( y , " x" ) devuelve el arcotangente de .I y/x en radianes. .TP .BI cos( expr ) devuelve el coseno de .IR expr , la cual está en radianes. .TP .BI exp( expr ) la función exponencial. .TP .BI int( expr ) truncado a entero. .TP .BI log( expr ) logaritmo natural. .TP .B rand() devuelve un número aleatorio entre 0 y 1. .TP .BI sin( expr ) retorna el seno de .IR expr , la cual está en radianes. .TP .BI sqrt( expr ) raíz cuadrada. .TP \&\fBsrand(\fR[\fIexpr\^\fR]\fB)\fR usa .I expr como la nueva semilla para el generador de números aleatorios. Si no se indica .I expr , se usa la hora del día. El valor de retorno es la anterior semilla del generador. .SS Funciones de cadena .PP .I Gawk dispone de las siguientes funciones predefinidas para cadenas: .PP .TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIexpr-list\^\fB)\fR'u+1n" \fBgensub(\fIr\fB, \fIs\fB, \fIh \fR[\fB, \fIt\fR]\fB)\fR buscar en la cadena objetivo .I t si hay ajustes de la expresión regular .IR r . Si .I h es una cadena que comienza por .B g o .BR G , entonces reemplazar todos los ajustes de .I r por .IR s . De otro modo, .I h es un número indicando cual de los ajustes de .I r debe reemplazarse. Si no se indica .I t , se usa .B $0 . Dentro del texto de reemplazo .IR s , puede usarse la secuencia .BI \e n\fR, donde .I n es un dígito de 1 a 9, para indicar solo el texto que se ha ajustado con la subexpresión con paréntesis .IR n 'ésima . La secuencia .B \e0 representa el texto ajustado completo, al igual que el carácter .BR & . A diferencia de .B sub() y .BR gsub() , la cadena modificada se devuelve como resultado de la función, y la cadena objetivo original .I no es modificada. .TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIexpr-list\^\fB)\fR'u+1n" \fBgsub(\fIr\fB, \fIs \fR[\fB, \fIt\fR]\fB)\fR para cada subcadena que ajuste con la expresión regular .I r en la cadena .IR t , substituye la cadena .IR s , y devuelve el número de sustituciones. Si no se ha indicado .I t , se usa .BR $0 . Un .B & en el texto de reemplazo es sustituido por el texto que ha sido ajustado en ese momento. Use .B \e& para obtener un .BR & literal. Vea .I "AWK Language Programming" para una descripción más detallada sobre las reglas para los .BR & y las barras invertidas en el texto de reemplazo de .BR sub() , .BR gsub() , y .BR gensub() . .TP .BI index( s , " t" ) devuelve el índice de la cadena .I t en la cadena .IR s , o 0 si .I t no aparece. .TP \fBlength(\fR[\fIs\fR]\fB) devuelve la longitud de la cadena .IR s , o la longitud de .B $0 si no se indica .I s . .TP .BI match( s , " r" ) devuelve la posición en .I s donde aparece la expresión regular .I r , o 0 si .I r no aparece, y modifica los valores de .B RSTART y .BR RLENGTH . .TP \fBsplit(\fIs\fB, \fIa \fR[\fB, \fIr\fR]\fB)\fR divide la cadena .I s en la tabla .I a en la expresión regular .IR r , y devuelve el número de campos. Si se omite .I r , se usa .B FS . La tabla .I a se borra al principio. La división funciona de forma idéntica a la división de campos, descrita anteriormente. .TP .BI sprintf( fmt , " lista-expr" ) imprime .I lista-expr de acuerdo con .IR fmt , y devuelve la cadena resultante. .TP \fBsub(\fIr\fB, \fIs \fR[\fB, \fIt\fR]\fB)\fR igual que .BR gsub() , pero solo se reemplaza la primera subcadena que ajusta. .TP \fBsubstr(\fIs\fB, \fIi \fR[\fB, \fIn\fR]\fB)\fR retorna la subcadena de .I s que comience por .IR i y que tenga como mucho .IR n caracteres. Si se omite .I n , se usa el resto de .I s . .TP .BI tolower( cad ) devuelve una copia de la cadena .IR cad , con todos los caracteres en mayúscula de .I cad cambiados por sus correspondientes en minúscula. Los caracteres no alfabéticos no son modificados. .TP .BI toupper( cad ) devuelve una copia de la cadena .IR cad , con todos los caracteres en minúscula de .I cad cambiados por sus correspondientes en mayúscula. Los caracteres no alfabéticos no son modificados. .SS Funciones de tiempo .PP Teniendo en cuenta que uno de los principales usos de los programas AWK es el procesamiento de ficheros de registro (log files) que contienen información de registro de tiempo, .I gawk proporciona las siguientes funciones para obtener registros de tiempo y darles formato. .PP .TP "\w'\fBsystime()\fR'u+1n" .B systime() devuelve la hora del día actual como el número de segundos desde la Época (Medianoche UTC del 1 Enero de 1970 en sistemas \*(PX). .TP \fBstrftime(\fR[\fIformato \fR[\fB, \fItimestamp\fR]]\fB)\fR da formato a .I timestamp de acuerdo con la especificación en .IR formato. El .I timestamp debe tener la misma forma que el retornado por .BR systime() . Si no aparece .I timestamp , se utiliza la hora del día actual. Si no aparece .I formato , se utiliza un formato por defecto equivalente a la salida de .IR date (1) . Vea la especificación de la función .B strftime() en \*(AN C para estar seguro de las conversiones de formato que se garantiza que existen. Una versión de dominio público de .IR strftime (3) y la correspondiente página de manual se distribuyen con .IR gawk ; si se usó esa versión para compilar .IR gawk , entonces todas las conversiones descritas en esa página de manual estarán disponibles para .IR gawk. .SS Constantes de cadena .PP Las constantes de cadena en AWK son secuencias de caracteres entre dobles comillas ( .B """ ). Dentro de las cadenas, se reconocen determinadas .I "secuencias de escape" , como en C. Son las siguientes: .PP .TP \w'\fB\e\^\fIddd\fR'u+1n .B \e\e Una barra invertida literal. .TP .B \ea El carácter de ``alerta''; usualmente el carácter \s-1ASCII\s+1 \s-1BEL\s+1 . .TP .B \eb carácter de borrado. .TP .B \ef salto de página. .TP .B \en salto de línea. .TP .B \er retorno de carro. .TP .B \et tabulador horizontal. .TP .B \ev tabulador vertical .TP .BI \ex "\^dígitos hexadecimales" El carácter representado por la cadena de dígitos hexadecimales que sigue a la .BR \ex . Como en \*(AN C, todos los dígitos hexadecimales siguientes se consideran como parte de la secuencia de escape. (Esta característica nos debería dar una idea sobre el diseño de lenguajes del comité.) Por ejemplo, \fB"\ex1B"\fR es el carácter \s-1ASCII\s+1 \s-1ESC\s+1 (escape). .TP .BI \e ddd El carácter representado por la secuencia de 1, 2 o 3 dígitos en octal. Por ejemplo . \fB"\e033"\fR es el carácter \s-1ASCII\s+1 \s-1ESC\s+1 (escape). .TP .BI \e c El carácter .IR c\^ literal. .PP Las secuencias de escape pueden usarse también dentro de constantes de expresiones regulares (p.ej., .B "/[\ \et\ef\en\er\ev]/" se ajusta con espacios en blanco). .PP En el modo de compatibilidad, los caracteres representados por secuencias de escape en octal o hexadecimal son tratados literalmente cuando son usados en contantes de expresiones regulares. Así, .B /a\e52b/ es equivalente a .BR /a\e*b/ . .SH FUNCIONES La funciones en AWK se definen de la siguiente manera: .PP .RS \fBfunction \fInombre\fB(\fIlista de parámetros\fB) { \fIsentencias \fB}\fR .RE .PP Las funciones se ejecutan cuando son llamadas desde dentro de las expresiones tanto desde patrones o acciones. Los parámetros reales usados en la llamada a la función se usan para instanciar los parámetros formales declarados en la función. Las tablas se pasan por referencia, las otras variables se pasan por valor. .PP Ya que las funciones no formaban parte originalmente del lenguaje AWK, el uso de variables locales es un tanto chapucero: Son declaradas como parámetros extra en la lista de parámetros. Por costumbre se separan las variables locales de los parámetros reales por espacios en blanco adicionales en la lista de parámetros. Por ejemplo: .PP .RS .ft B .nf function f(p, q, a, b) # a & b son locales { \&..... } /abc/ { ... ; f(1, 2) ; ... } .fi .ft R .RE .PP Es necesario que el paréntesis izquierdo en una llamada a función siga inmediatamente al nombre de la función, sin añadir ningún espacio en blanco. Esto es necesario para evitar ambigüedades sintácticas con el operador de concatenación. Esta restricción no se aplica a las funciones predefinidas listadas anteriormente. .PP Las funciones pueden llamarse las unas a las otras y pueden ser recursivas. Los parámetros usados como variables locales son inicializados con una cadena vacía y el número cero en la invocación de la función. .PP Si se indicó .B \-\^\-lint , .I gawk generará mensajes de alarma sobre llamadas a funciones no definidas en tiempo de análisis, en vez de en tiempo de ejecución. Llamar a una función no definida en tiempo de ejecución es un error fatal. .PP Puede usarse la palabra .B func en vez de .BR function . .SH EJEMPLOS .nf Imprimir y ordenar los nombres de ingreso de todos los usuarios: .ft B BEGIN { FS = ":" } { print $1 | "sort" } .ft R Contar las líneas de un fichero: .ft B { nlines++ } END { print nlines } .ft R Añadir el número de línea al principio de cada una en el fichero: .ft B { print FNR, $0 } .ft R Concatenar y número de línea (una variación del ejercicio): .ft B { print NR, $0 } .ft R .fi .SH VÉASE TAMBIÉN .IR egrep (1), .IR getpid (2), .IR getppid (2), .IR getpgrp (2), .IR getuid (2), .IR geteuid (2), .IR getgid (2), .IR getegid (2), .IR getgroups (2) .PP .IR "The AWK Programming Language" , Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X. .PP .IR "AWK Language Programming" , Edition 1.0, published by the Free Software Foundation, 1995. .SH COMPATIBILIDAD POSIX Un objetivo principal de .I gawk es la compatibilidad con el estándar \*(PX, y a su vez la compatibilidad con la última versión del .IR awk de \*(UX . Hasta la fecha, .I gawk incorpora las siguientes capacidades para el usuario que no se describen en el libro de AWK, pero que forman parte de la versión de Bell Labs de .IR awk , y se encuentran en el estándar \*(PX . .PP La opción .B \-v para asignar variables antes de la ejecución del programa es nueva. El libro dice que las asignaciones de variables de la línea de órdenes ocurrirían cuando .I awk abriera el argumento como un fichero, lo cual es antes de ejecutar el bloque .B BEGIN . De todos modos, en implementaciones más modernas, cuando una asignación como esta aparece antes que ningún nombre de fichero, la asignación ocurriría .I antes de que el bloque .B BEGIN fuera ejecutado. Las aplicaciones acostumbran a depender de esta ``característica.'' Cuando .I awk fue modificado para acomodarse a su documentación, se añadió esta opción para acomodar a las aplicaciones que dependen de esta vieja característica. (Esta característica fue aceptada tanto por los desarrolladores de AT&T como por los de GNU.) .PP La opción .B \-W para implementación de características específicas pertenece al estándar \*(PX. .PP Durante el procesado de argumentos, .I gawk usa la opción especial ``\fB\-\^\-\fP'' para señalar el final de los argumentos. En modo compatibilidad, las opciones no definidas darán un mensaje de alerta, pero de todos modos son ignoradas. En operación normal, estos argumentos son pasados al programa AWK para que sean procesados. .PP El libro de AWK no define el valor de retorno de .BR srand() . El estándar \*(PX hace que devuelva la semilla que estaba usando, para permitir seguir la pista de las secuencias de números aleatorios. Por este motivo, .B srand() en .I gawk devuelve igualmente la semilla actual. .PP Otras características nuevas son: El uso de múltiples opciones .B \-f (a partir de MKS .IR awk ); la tabla .B ENVIRON ; las secuencias de escape .BR \ea , y .BR \ev (implementadas originalmente en .I gawk y añadidas en la versión de AT&T); las funciones predefinidas .B tolower() y .B toupper() (a partir de AT&T); y las especificaciones de conversión de \*(AN C en .B printf (implementadas por primera vez en la versión de AT&T). .SH EXTENSIONES DE GNU .I Gawk contiene una serie de extensiones del .IR awk de \*(PX. Se describen en esta sección. Las extensiones que se describen aquí pueden desactivarse llamando a .I gawk con la opción .B \-\^\-traditional . .PP Las siguientes capacidades de .I gawk no están disponibles en el .IR awk de \*(PX. .RS .TP \w'\(bu'u+1n \(bu La secuencia de escape .B \ex . (Desactivada con .BR \-\^\-posix .) .TP \w'\(bu'u+1n \(bu La función .B fflush() . (Desactivada con .BR \-\^\-posix .) .TP \(bu Las funciones .BR systime(), .BR strftime(), y .B gensub() . .TP \(bu Los nombres de fichero especiales para redirección de E/S no son reconocidos. .TP \(bu Las variables .BR ARGIND , .BR ERRNO , y .B RT no son especiales. .TP \(bu La variable .B IGNORECASE y sus efectos no están disponibles. .TP \(bu La variable .B FIELDWIDTHS y la división de campos de ancho fijo. .TP \(bu El uso de .B RS como una expresión regular. .TP \(bu La habilidad de dividir caracteres individuales usando la cadena vacía como valor para .BR FS , y como tercer argumento para .BR split() . .TP \(bu No se realiza búsqueda de camino para los ficheros nombrados mediante la opción .B \-f . Por ello, la variable de entorno .B AWKPATH no es especial. .TP \(bu El uso de .B "nextfile" para abandonar el procesado del fichero de entrada actual. .TP \(bu El uso de .BI delete " tabla" para borrar todo el contenido de una tabla. .RE .PP El libro de AWK no define el valor de retorno de la función .B close() . El .B close() de .IR gawk devuelve el valor de .IR fclose (3), o .IR pclose (3), cuando se esté cerrando un fichero o una tubería, respectivamente. .PP Cuando se invoca a .I gawk con la opción .B \-\^\-traditional , si el argumento .I fs para la opción .B \-F es ``t'', entonces se asignará a .B FS el carácter tabulador. Nótese que escribiendo .B "gawk \-F\et \&..." simplemente se provoca que el shell lo cambie por el literal ``t'', y no pase ``\et'' a la opción .B \-F . Dado que es un caso un tanto especial y bastante desagradable, esta no es la manera por defecto de actuar. Tampoco se actúa de esta manera si se ha especificado .B \-\^\-posix . Para tener un tabulador como separador de campo, es mejor usar el entrecomillado: .BR "gawk \-F'\et' \&..." . .ig .PP Si .I gawk fue compilado para reparación de errores (debugging), aceptará las siguientes opciones: .TP .PD 0 .B \-Wparsedebug .TP .PD .B \-\^\-parsedebug Activar la salida de reparación de errores de .IR yacc (1) o .IR bison (1) durante el análisis sintáctico del programa. Esta opción solo debería tener interés para los mantenedores de .I gawk , y normalmente no estará compilada en .IR gawk . .. .SH CAPACIDADES HISTÓRICAS Hay dos características de implementaciones históricas de AWK que .I gawk soporta. Primera, es posible llamar a la función predefinida .B length() no solamente sin argumento, ¡sino incluso sin paréntesis! Por eso, .RS .PP .ft B a = length .ft R .RE .PP es igual que las siguientes .RS .PP .ft B a = length() .br a = length($0) .ft R .RE .PP Esta característica se tilda de ``censurable'' en el estándar \*(PX, y .I gawk generará un mensaje de alerta sobre su uso si se especifica .B \-\^\-lint en la línea de orden. .PP La otra característica es el uso de las sentencias .B continue o .B break fuera del cuerpo de un bucle .BR while , .BR for , o .B do . Las implementaciones tradicionales de AWK han tratado este uso de forma equivalente a la sentencia .B next . .I Gawk soportará este uso si se especifica .B \-\^\-traditional en la línea de orden. .SH VARIABLES DE ENTORNO Si .B POSIXLY_CORRECT existe en el entorno, entonces .I gawk actúa exactamente como si se hubiera especificado .B \-\^\-posix en la línea de orden. Si se hubiera especificado .B \-\^\-lint , .I gawk generaría un mensaje de alerta. .PP La variable de entorno .B AWKPATH puede usarse para proveer a .I gawk de una lista de directorios en la que buscar los ficheros nombrados mediante las opciones .B \-f y .B \-\^\-file . .SH FALLOS La opción .B \-F no es necesaria dada la característica de las asignaciones de variables por la línea de orden; se mantiene por compatibilidad. .PP Si su sistema dispone de soporte para el fichero .B /dev/fd y los asociados .BR /dev/stdin , .BR /dev/stdout , y .B /dev/stderr , puede obtener diferente salida desde .I gawk a la que podría obtener en un sistema sin estos ficheros. Cuando .I gawk interpreta estos ficheros internamente, sincroniza la salida a la salida estándar con la salida a .BR /dev/stdout , mientras que en un sistema con estos ficheros, la salida realmente se envía ficheros abiertos diferentes. .PP Los programas de un solo carácter sintácticamente incorrectos tienden a sobrepasar la pila del analizador sintáctico, generando un mensaje bastante poco útil. Sorprendentemente, estos programas son difíciles de diagnosticas en el caso general, y el esfuerzo para hacerlo realmente no merece la pena. .SH INFORMACIÓN DE LA VERSIÓN Esta página de manual documenta la versión 3.0.2 de .IR gawk . .SH AUTORES La versión original de .I awk para \*(UX fue diseñada e implementada por Alfred Aho, Peter Weinberger, y Brian Kernighan de AT&T Bell Labs. Brian Kernighan continúa con su mantenimiento y mejora. .PP Paul Rubin y Jay Fenlason, de la Free Software Foundation, escribió .IR gawk , para ser compatible con la versión original de .I awk distribuida en \*(UX Seventh Edition. John Woods contribuyó arreglando algunos fallos. David Trueman, con contribuciones de Arnold Robbins, hizo que .I gawk fuera compatible con la nueva versión del .IR awk de \*(UX. Arnold Robbins es el actual mantenedor. .PP La versión original para DOS fue realizada por Conrad Kwok y Scott Garfinkle. Scott Deifik es el mantenedor actual para DOS. Pat Rankin realizó el paso a VMS, y Michal Jaegermann hizo el paso al Atari ST. El paso a OS/2 lo realizó Kai Uwe Rommel, con contribuciones y ayudas de Darrel Hankerson. Fred Fish aportó soporte para el Amiga. .SH INFORME DE FALLOS Si encontrara algún fallo en .IR gawk , envíe por favor un mensaje electrónico a .BR bug-gnu-utils@prep.ai.mit.edu , .I con una copia de carbón a .BR arnold@gnu.ai.mit.edu . Por favor, incluya su sistema operativo y su revisión, la versión de .IR gawk , qué compilador de C usó para compilarlo, y el programa de prueba y los datos mínimos para reproducir el problema. .PP Antes de enviar un informe de fallos, haga por favor dos cosas. Primero, verifique que dispone de la última versión de .IR gawk . Muchos fallos (normalmente bastante sutiles) son arreglados en cada nueva versión, y si la suya está obsoleta, el problema podría estar ya arreglado. Segundo, por favor lea detenidamente tanto esta página de manual como el manual de referencia para estar seguro que lo que usted piensa que es un fallo realmente lo sea, en vez de una mala interpretación del lenguaje. .PP Sea lo que sea que haga, .B NO remita un informe de fallo en .BR comp.lang.awk . Aunque los desarrolladores de .I gawk leen este grupo de noticias de forma ocasional, remitir informes de fallos en dicho grupo no es una forma muy segura de hacerlo. Utilice preferiblemente las direcciones de correo electrónico anteriores. .SH RECONOCIMIENTOS Brian Kernighan de Bell Labs proveyó de una valiosa asistencia durante las pruebas y la eliminación de fallos. Le damos las gracias. .SH PERMISOS DE COPIA Copyright \(co 1996 Free Software Foundation, Inc. .PP Se concede permiso para hacer y distribuir copias literales de esta página de manual siempre que se preserven tanto la nota de copyright como esta nota de permisos en todas las copias. .ig Se concede permiso para procesar este fichero mediante troff e imprimir los resultados, incluyendo en el documento impreso una copia de la nota de permisos de copia idéntica a la actual excepto por la eliminación de este párrafo (siendo este párrafo no relevante para la página de manual impresa). .. .PP Se concede permiso para copiar y distribuir versiones modificadas de esta página de manual bajo las condiciones de la copia literal, siendo los resultados completos del trabajo derivado distribuidos bajo los términos de una nota de permisos idéntica a esta. .PP Se concede permiso para copiar y distribuir traducciones de esta página de manual a otros idiomas, bajo las anteriores condiciones para versiones modificadas, exceptuando que esta nota de permisos debe manifestarse mediante una traducción aprobada por la Fundación. .PP .B "Nota del traductor:" Dado que la traducción de esta nota no está aprobada por la Free Software Foundation, se añade la nota original en Inglés. .SH COPYING PERMISSIONS Copyright \(co 1996 Free Software Foundation, Inc. .PP Permission is granted to make and distribute verbatim copies of this manual page provided the copyright notice and this permission notice are preserved on all copies. .PP Permission is granted to process this file through troff and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual page). .PP Permission is granted to copy and distribute modified versions of this manual page under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. .PP Permission is granted to copy and distribute translations of this manual page into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation.