Provided by:
manpages-es-extra_0.8a-17_all 
NOMBRE
gawk - lenguaje de analisis y procesamiento de patrones
SINOPSIS
gawk [ opciones del estilo POSIX o GNU ] -f fichero-de-programa [ -- ]
fichero ...
gawk [ opciones del estilo POSIX o GNU ] [ -- ] texto-del-programa
fichero ...
DESCRIPCI'ON
Gawk es la implementacion del Proyecto GNU del lenguaje de programacion
AWK. Esta conforme con la definicion del lenguaje en el POSIX 1003.2
Command Language And Utilities Standard. Esta version esta basada, a
su vez, en la descripcion de The AWK Programming Language, escrito por
Aho, Kernighan, y Weinberger, con las caracteristicas adicionales que
aparecen en la version del System V de UNIX awk. Gawk igualmente
provee de las recientes extensiones del awk de Bell Labs, y algunas
extensiones especificas de GNU.
La linea de orden consiste en opciones para el propio gawk , el texto
del programa AWK (si no se provee mediante las opciones -f o --file ),
y los valores que deben estar disponibles en las variables predefinidas
de AWK ARGC y ARGV .
FORMATO DE LAS OPCIONES
Las opciones de Gawk pueden seguir tanto el estilo tradicional de
opciones de una letra de POSIX , como el estilo GNU de opciones largas.
Las opciones POSIX comienzan con un solo ''-'', mientras que las
opciones largas lo hacen con ''--''. Se ofrecen opciones largas tanto
para las caracteristicas especificas de GNU como para las
caracteristicas definidas por POSIX.
Siguiendo el estandar POSIX, las opciones especificas de gawk se
proveen via argumentos con la opcion -W . Pueden anadirse multiples
opciones -W . Cada una de las opciones -W tienen su correspondiente
opcion larga, tal y como de detalla mas adelante. Los argumentos de las
opciones largas deben estar unidas a la opcion mediante un signo = ,
sin espacios en blanco, o pueden proveerse en el siguiente argumento de
la linea de orden. Las opciones largas pueden ser abreviadas, siempre
y cuando la abreviatura sea unica.
OPCIONES
Gawk acepta las siguientes opciones.
-F fs
--field-separator fs
Use fs para definir el separador de campos de la entrada (el
valor de la variable predefinida FS ).
-v var=val
--assign var=val
Asigna el valor val, a la variable var, antes de que la
ejecucion del programa comience. Estos valores de variable
estan disponibles en el bloque BEGIN de un programa AWK.
-f fichero-de-programa
--file fichero-de-programa
Leer el fuente del programa AWK del fichero fichero-de-programa,
en vez de obtenerlo del primer argumento de la linea de orden.
Pueden usarse multiples opciones -f (o --file).
-mf NNN
-mr NNN
Definir varios limites de memoria al valor NNN. El indicador f
define el maximo numero de campos, y el indicador r define el
tamano maximo de un registro. Estos dos indicadores y la opcion
-m son de la version de awk para UNIX de la version de
investigacion de Bell Labs. Son ignoradas por gawk, ya que gawk
no tiene limites predefinidos.
-W traditional
-W compat
--traditional
--compat
Ejecutar en el modo de compatibilidad . En este modo de
funcionamiento, gawk funciona de manera identica al awk de UNIX
; ninguna de las extensiones especificas de GNU son reconocidas.
Es preferible el uso de la forma --traditional en vez de las
otras formas de esta opcion. Vea EXTENSIONES DE GNU, mas
adelante, para mas informacion.
-W copyleft
-W copyright
--copyleft
--copyright
Imprime una version corta del mensaje de informacion sobre
derechos de copia de GNU en la salida estandar, y termina de
forma correcta.
-W help
-W usage
--help
--usage
Imprime un resumen relativamente corto de las opciones
disponibles por la salida estandar. (Siguiendo los GNU Coding
Standards, estas opciones causan una salida satisfactoria
inmediata.)
-W lint
--lint Genera mensajes de advertencia sobre construcciones que son
dudosas o no portables para otras implementaciones de AWK.
-W lint-old
--lint-old
Genera mensajes de advertencia sobre construcciones que no son
portables a la version original de Unix. awk.
-W posix
--posix
Esta opcion activa el modo de compatibilidad , con las
siguientes restricciones adicionales:
o \x las secuencias de escape no son reconocidas.
o Solo los espacios y los tabuladores actuan como separadores de
campo cuando FS contiene un unico espacio, y no los saltos de
linea.
o El sinonimo func para la palabra clave function no es
reconocido.
o Los operadores ** y **= no pueden ser usados en vez de ^ y ^=.
o La funcion fflush() no esta disponible.
-W re-interval
--re-interval
Activa el uso de las expresiones de intervalos en el ajuste de
expresiones regulares (vea Expresiones Regulares, mas adelante).
Las expresiones de intervalos no eran soportadas
tradicionalmente por el lenguaje AWK. El estandar POSIX las
anadio, para hacer que awk y egrep fueran consistentes entre
ellos. De cualquier modo, es probable que su uso entorpezca el
uso de programas AWK antiguos, por este motivo gawk solo las
provee si son pedidas mediante esta opcion, o si se ha
especificado --posix .
-W source texto-del-programa
--source texto-del-programa
Usar program-text como el codigo fuente del programa AWK. Esta
opcion permite la facil mezcla de funciones de libreria (usadas
mediante las opciones -f y --file ) con codigo fuente entrado
por la linea de orden. Se ha propuesto primordialmente como un
medio para agrandar programas AWK usados en scripts de shell.
-W version
--version
Imprime informacion sobre la version de esta copia de gawk en
particular por la salida estandar. Es util principalmente para
saber si la copia actual de gawk en su sistema esta al dia
respecto con cualquier cosa que la Free Software Foundation este
distribuyendo. Tambien es util para dar avisos sobre fallos.
(Siguiendo los GNU Coding Standards, estas opciones causan una
salida satisfactoria inmediata.)
-- Senala el final de las opciones. Es util para permitir que los
futuros argumentos al propio programa AWK puedan comenzar
tambien por un ``-''. Esto es principalmente para mantener la
consistencia con las convenciones de analisis de argumentos
usados por la mayoria de los restantes programas POSIX.
En el modo compatibilidad, cualquier otra opcion sera marcada como
ilegal, aunque sean ignoradas. En operacion normal, mientras el texto
del programa haya sido incluido, las opciones no reconocidas son
pasadas al programa AWK en la tabla ARGV para ser procesadas. Es
particularmente util para ejecutar programas AWK mediante el mecanismo
de interprete de ejecutables ''#!''.
EJECUCI'ON DE UN PROGRAMA AWK
Un programa AWK consiste en una secuencia de sentencias tipo patron-
accion y definiciones de funcion opcionales.
patr'on { sentencias de acci'on }
function nombre(lista de par'ametros) { sentencias }
Gawk primero lee el fuente del programa a partir de los fichero(s)-de-
programa si se han especificado, a partir de los argumentos de
--source, o a partir del primer argumento que no sea una opcion de la
linea de orden. Las opciones -f y --source pueden ser usadas mas de
una vez en una linea de orden. Gawk leera el texto del programa como
si todos los fichero(s)-de-programa y textos fuentes de la linea de
orden hubieran sido concatenados. Esto es util para construir
librerias de funciones AWK, sin tener la necesidad de incluirlos en
cada uno de los nuevos programas AWK que las use. Ademas ofrece la
capacidad de mezclar funciones de libreria con programas de la linea de
orden.
La variable de entorno AWKPATH especifica un camino de busqueda para
ser usado cuando se busque los ficheros indicados con la opcion -f .
Si esta variable no existiera, el camino por defecto seria
".:/usr/local/share/awk". (El directorio actual puede variar,
dependiendo de desde donde se compilo e instalo gawk .) Si un fichero
dado a la opcion -f contiene un caracter ''/'', no se realiza ningun
tipo de busqueda.
Gawk ejecuta los programas AWK en el siguiente orden. Primero, todas
las asignaciones de variables especificadas mediante la opcion -v se
realizan. A continuacion, gawk compila el programa en un formato
interno. Despues, gawk ejecuta el codigo del/los bloque(s) BEGIN (si
existe alguno), y a continuacion procede a leer cada uno de los
ficheros nombrados en la tabla ARGV . Si no existe ningun nombre de
fichero en la linea de orden, gawk lee de la entrada estandar.
Si el nombre de un fichero en la linea de orden tiene la forma var=val
sera tratado como una asignacion de variable. Se asignara a la variable
var el valor val. (Esto ocurre despues de que cualquier bloque(s)
BEGIN haya sido ejecutado.) Las asignaciones en la linea de orden es
util sobre todo para asignar valores de forma dinamica a las variables
que AWK usa para controlar como es troceada la entrada en campos y
registros. Es tambien util para controlar el estado si son necesarios
multiples pasos sobre el mismo fichero de datos.
Si el valor de alguno de los elementos particulares de ARGV esta vacio
(""), gawk se lo salta.
Para cada registro de la entrada, gawk prueba si es posible ajustarlo
con alguno de los patrones en el programa AWK. Para cada patron con el
cual el registro concuerde, se ejecuta la acci'on asociada. Los
patrones son probados en el orden en que aparecen en el programa.
Finalmente, despues de que toda la entrada se ha terminado, gawk
ejecuta el codigo en el/los bloque(s) END (si existiera alguno).
VARIABLES, REGISTROS Y CAMPOS
Las variables AWK son dinamicas; su existencia comienza cuando son
usadas por primera vez. Sus valores son numeros de coma flotante o
cadenas de caracteres, o ambos, dependiendo de como son usadas. AWK
tambien dispone de tablas unidimensionales; las tablas
multidimensionales pueden ser simuladas. Varias variables predefinidas
se definen cuando un programa comienza a ejecutarse; seran descritas
cuando convenga y seran resumidas mas adelante.
Registros
Normalmente, los registros se separan por caracteres de salto de linea.
Puede controlar como son separados los registros asignando valores a la
variable predefinida RS. Si RS tiene un unico caracter, ese caracter
separara los registros. De otro modo, RS se considerara como una
expresion regular. El texto de la entrada que concuerde con esa
expresion regular sera el que separara los registros. De todas
maneras, en el modo compatibilidad, solo el primer caracter de esa
cadena sera usado para separar registros. Si RS contiene la cadena
vacia, entonces los registros seran separados por espacios en blanco.
Cuando RS contiene la cadena vacia, el caracter de salto de linea
siempre actua como separador de campos, anadiendose a cualquier valor
que FS pudiera tener.
Campos
Conforme cada registro de entrada es leido, gawk divide el registro en
campos, usando el valor de la variable FS como separados de campos. Si
FS tiene un unico caracter, los campos seran separados por ese
caracter. Si FS contiene la cadena vacia, entonces cada caracter
individual se convierte en separador de campo. De otro modo, se espera
que FS sea una expresion regular completa. En el caso especial de que
FS tuviera un unico espacio en blanco, los campos serian separados por
tiras de espacios y/o tabuladores y/o saltos de linea. (Vea la
discusion sobre --posix, mas adelante). Notese que el valor de
IGNORECASE (vea mas adelante) afectara tambien a como son divididos los
registros en el caso de que FS fuera una expresion regular, y a como
son separados cuando RS fuera una expresion regular.
Si la variable FIELDWIDTHS esta definida como una lista de numero
separados por espacios, se espera que cada campo tenga ancho fijo, y
gawk dividiria el registro usando los anchos especificados. El valor de
FS es ignorado es este caso. Asignar un nuevo valor a FS haria
saltarse el uso de FIELDWIDTHS, y volver a la forma de actuar por
defecto.
Cada campo en el registro de entrada puede ser referenciado por su
posicion, $1, $2, etc. $0 es el registro completo. El valor de un
campo puede ser tambien asignado. Los campos no necesitan ser
referenciados por constantes:
n = 5
print $n
imprime el quinto campo del registro de entrada. La variable NF se
define con el numero total de campos en el registro de entrada.
Las referencias a campos que no existen (por ejemplo los campos por
detras de $NF) producen la cadena vacia. De todas maneras, la
asignacion de un campo no existente (por ejemplo, $(NF+2) = 5)
incrementaria el valor de NF, creando los campos que intervienen como
cadenas vacias, y causando que el valor de $0 fuera recalculado, siendo
separados los campos mediante el valor de OFS. Las referencias a
campos con numeracion negativa causan un error fatal. Decrementar NF
causa que el valor de los campos que pasen del nuevo numero se pierda,
y el valor de $0 sea recalculado, siendo separados los campos mediante
el valor de OFS.
Variables Predefinidas
Las variables predefinidas de gawk son:
ARGC EL numero de argumentos en la linea de orden (no incluye
las opciones para gawk, o el fuente del programa).
ARGIND El indice en ARGV del fichero que actualmente se esta
procesando.
ARGV Tabla con los argumentos de la linea de orden. La tabla
esta indexada desde el 0 hasta ARGC - 1. Cambiando
dinamicamente el contenido de ARGV permite controlar los
ficheros usados para datos.
CONVFMT El formato de conversion para numeros,por defecto "%.6g".
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, ENVIRON["HOME"] podria ser /home/arnold).
Cambiar esta tabla no afecta al entorno de los programas
que gawk ejecuta via redireccion o la funcion system() .
(Esto podria cambiar en una futura version de gawk.)
ERRNO Si ocurre algun error de sistema tanto por hacer una
redireccion con getline, durante una lectura con getline, o
durante un close(), entonces ERRNO contendra una cadena de
caracteres describiendo el error.
FIELDWIDTHS Una lista de anchos de campo separados por espacios. Cuando
este definida, gawk analiza la entrada como campos de
tamano fijo, en vez de usando el valor de la variable FS
como separador de campo. La capacidad de trabajar con
anchos de campo fijos es todavia experimental; las
semanticas podrian cambiar conforme gawk se vaya
desarrollando en el tiempo.
FILENAME El nombre del fichero de entrada actual. Si no se ha
especificado ningun fichero en la linea de orden, el valor
de FILENAME sera ``-''. De todos modos, FILENAME no esta
definida dentro de un bloque BEGIN .
FNR El numero de registro de entrada en el fichero de entrada
actual.
FS El separador de campo de entrada, un espacio por defecto.
Vea Fields, mas arriba.
IGNORECASE Controla la sensibilidad a mayusculas de todas las
expresiones regulares y operaciones con cadenas. Si
IGNORECASE tiene un valor diferente de cero, entonces las
comparaciones entre cadenas y las comprobaciones de
patrones en las reglas, la division de campos con FS, la
separacion de registros con RS, la comprobacion de
expresiones regulares con ~ y !~, y las funciones
predefinidas gensub(), gsub(), index(), match(), split(), y
sub() ignoraran la diferencia entre minusculas y mayusculas
cuando realicen operaciones con expresiones regulares. De
este modo, si IGNORECASE no es igual a cero, /aB/ concuerda
con todas las cadenas "ab", "aB", "Ab", y "AB". Como con
todas las otras variables de AWK, el valor inicial de
IGNORECASE es cero, por lo que todas las operaciones con
expresiones regulares y cadenas son normalmente sensibles a
las mayusculas. Bajo Unix, el conjunto de caracteres ISO
8859-1 Latin-1 es usado cuando se ignoran las mayusculas.
NOTA: En versiones de gawk anteriores a la 3.0, IGNORECASE
solo afectaba a las operaciones con expresiones regulares.
Ahora tambien afecta a las comparaciones de cadenas.
NF El numero de campos en el registro de entrada actual.
NR El numero total de registros de entrada que han aparecido
desde el principio.
OFMT El formato de salida para los numeros, por defecto es
"%.6g".
OFS El separador de campos de salida, un espacio por defecto.
ORS El separador de registros de salida, por defecto un salto
de linea.
RS El separador de registros de entrada, por defecto un salto
de linea.
RT El terminador de los registros. Gawk define RT con el
texto de entrada que concordo con el caracter o expresion
regular especificada por RS.
RSTART El indice del primer caracter concordado por match(); 0 si
no concordo ninguno.
RLENGTH La longitud de la cadena concordada por match(); -1 si no
concordo ninguna.
SUBSEP El caracter usado para separar multiples subindices en
elementos de tipo tabla, por defecto "\034".
Tablas
Las tablas se indexan mediante una expresion entre corchetes ([ y ]).
Si la expresion es una lista de expresiones (expr, expr ...) entonces
el indice de la tabla es una cadena de caracteres resultado de la
concatenacion de los valores (cadenas) de cada una de las expresiones,
separados por el valor de la variable SUBSEP Esta capacidad se utiliza
para simular tablas de multiples dimensiones. Por ejemplo:
i = "A"; j = "B"; k = "C"
x[i, j, k] = "hola, mundo\n"
asigna la cadena "hola, mundo\n" al elemento de la tabla x que esta
indexado por la cadena "A\034B\034C". Todas las tablas en AWK son
asociativas, es decir, indexadas por valores de tipo cadena.
El operador especial in puede ser usado en las ordenes if o while para
comprobar si una tabla contiene un indice consistente en un valor
particular.
if (val in tabla)
print tabla[val]
Si la tabla tiene multiples subindices, use (i, j) in tabla.
La construccion in tambien puede usarse en bucles de tipo for para
iterar sobre todos los elementos de una tabla.
Un elemento puede ser eliminado de una tabla usando la orden delete La
orden delete puede ser usada tambien para borrar completamente los
contenidos de una tabla, simplemente especificando el nombre de la
tabla sin ningun indice.
Tipado de Variables y Conversiones
Las variables y los campos pueden ser numeros (de coma flotante), o
cadenas de caracteres, o ambos. Dependera del contexto como sera
interpretado el valor de una variable. Si se usa en una expresion
numerica, sera tratado como numero, si se usa como una cadena sera
tratada como una cadena.
Para forzar que una variable sea tratada como un numero, sumele un 0;
para forzar que sea tratada como una cadena, concatenela con la cadena
vacia.
Cuando una cadena debe ser convertida a numero, la conversion se
realiza usando atof(3). Un numero es convertido en cadena usando el
valor de CONVFMT como cadena de formato para sprintf(3), con el valor
numerico de la variable como el argumento. De todas maneras, aunque
todos los numeros en AWK son reales de coma flotante, los valores
enteros son siempre convertidos como enteros. De tal manera que, dados
CONVFMT = "%2.2f"
a = 12
b = a ""
la variable b contendra el valor de tipo cadena "12" y no "12.00".
Gawk realiza comparaciones tal y como sigue: Si dos variables son
numericas, son comparadas numericamente. Si un valor es numerico y el
otro tiene un valor de tipo cadena que es un ``cadena numerica'',
entonces las comparaciones se hacen numericamente. En otro caso, el
valor numerico 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 estandar POSIX, si dos cadenas fueran cadenas numericas deberia
realizarse una comparacion numerica. De todas maneras, esto es
claramente incorrecto, y gawk no lo hace asi.
Notese que las constantes de tipo cadena, como "57", no son cadenas
numericas, sino constantes de cadena. La idea de ``cadena numerica''
solo se aplica a los campos, entradas con getline , los elementos de
FILENAMEy ARGV , elementos de ENVIRON y los elementos de una tabla
creada mediante split() que son cadenas numericas. La idea basica es
que las entradas de usuario, y solo las entradas de usuario, que
parezcan numericas, seran tratadas de esta manera.
Las variables sin inicializar tendran el valor numerico 0 y la cadena
"" (cadena nula o vacia).
PATRONES Y ACCIONES
AWK es un lenguaje orientado a la linea. Primero se indica el patron, y
luego la accion. Las sentencias de las acciones se engloban mediante {
y }. Puede no indicarse el patron o la accion, pero por supuesto, no
ambos. Si no se especifica el patron, la accion sera ejecutada por
cada uno de los registros individuales de la entrada. Si no se
especifica la accion es equivalente a escribir la accion
{ print }
la cual imprime el registro completo.
Los comentarios comienzan con el caracter ``#'', y continuan hasta el
final de la linea. Pueden usarse lineas en blanco para separar
sentencias. Normalmente, una sentencia termina con un salto de linea,
aunque este no es el caso de las lineas que finalizan con un ``,'', {,
?, :, &&, o ||. Las lineas que terminan con do o else tambien se
considera que continuan en la siguiente linea. En otros casos, una
linea podra ser continuada en la siguiente poniendo al final un ``\'',
en cuyo caso se ignorara el salto de linea.
Se pueden poner multiples sentencias en la misma linea separandolos
mediante un ``;''. Esto se aplica tanto para las sentencias que
componen la parte de la accion de un par patron-accion (el caso mas
usual), como para las propias sentencias patron-accion.
Patrones
Los patrones de AWK pueden ser uno de los siguientes:
BEGIN
END
/expresi'on regular/
expresi'on relacional
patr'on && patr'on
patr'on || patr'on
patr'on ? patr'on : patr'on
(patr'on)
! patr'on
patr'on1, patr'on2
BEGIN y END son dos patrones de tipo especial que no son utilizados
para comprobarlos contra la entrada. Las acciones de todos los
patrones BEGIN se juntan como si todas las sentencias hubieran sido
escritas en un unico bloque BEGIN . Son ejecutadas antes de que se lea
algo de la entrada. De forma analoga, todos los bloques END se juntan,
y son ejecutados cuando se ha agotado toda la entrada (o cuando se
ejecuta una sentencia exit ). Los patrones BEGIN y END no pueden ser
combinados con otros patrones en expresiones de patron. Los patrones
BEGIN y END no pueden tener vacia la parte de la accion.
Para los patrones con /expresiones regulares/ , la sentencia asociada
se ejecuta para cada registro de entrada que concuerde con la expresion
regular. Las expresiones regulares son las mismas que las usadas en
egrep(1), y se encuentran resumidas mas adelante.
Una expresi'on relacional puede usar cualquiera de los operadores
definidos en la parte de acciones de esta seccion. Estas generalmente
comprueban si ciertos campos concuerdan con una cierta expresion
regular.
Los operadores &&, ||, y ! son respectivamente la Y logica, la O
logica, y la NO logica, como en C. Hacen evaluaciones de circuito
corto, tambien como en C, y se usan para combinar varias expresiones de
patron primitivas. Como en la mayoria de los lenguajes, pueden usarse
parentesis para cambiar el orden de la evaluacion.
El operador ?: es igual que el mismo operador en C. Si el primer patron
es cierto el patron usado para las comprobaciones es el segundo, en
caso contrario es el tercero. De entre el segundo y el tercer patron,
solo es evaluado uno de ellos.
La forma patr'on1, patr'on2 para una expresion recibe el nombre de rango
de patrones. Concuerda con todos los registros de la entrada que
existan entre el registro que concuerde con patr'on1, y el registro que
concuerde con patr'on2, inclusive. No combina con ningun otro tipo de
expresion de patron.
Expresiones Regulares
Las expresiones regulares corresponden con el tipo extendido usado en
egrep. Estan compuestas por caracteres como sigue:
c concuerda con el caracter c(nometacar'acter).
\c concuerda con el caracter literal c.
. concuerda con cualquier caracter incluyendo el salto de
linea.
^ concuerda con el principio de una cadena.
$ concuerda con el fin de una cadena.
[abc...] lista de caracteres, concuerda con cualquiera de los
caracteres abc....
[^abc...] lista negada de caracteres, concuerda con cualquier caracter
excepto abc....
r1|r2 alternativa: concuerda con r1 o r2.
r1r2 concatenacion: concuerda con r1, y despues con r2.
r+ concuerda con una o mas apariciones de r.
r* concuerda con cero o mas apariciones de r.
r? concuerda con cero o una aparicion de r.
(r) agrupacion: concuerda con r.
r{n}
r{n,}
r{n,m} Uno o dos numeros entre llaves denotan una expresi'on de
intervalo. Si hay un numero entre llaves, la expreg.
precedente r se repite n veces. Si hay dos numeros separados
por una coma, r se repite de n a m veces. Si hay un numero
seguido de una coma, entonces r se repite como minimo n
veces.
Las expresiones de intervalo solo estan disponibles si se
especifica --posix o --re-interval en la linea de orden.
\y concuerda con la cadena vacia tanto en el principio como en
el final de una palabra.
\B concuerda con la cadena vacia dentro de una palabra.
\< concuerda con la cadena vacia al principio de una palabra.
\> concuerda con la cadena vacia al final de una palabra.
\w concuerda con cualquier caracter constitutivo de palabra
(letra, digito, o subrayado.)
\W concuerda con cualquier caracter que no es constitutivo de
palabra.
\` concuerda con la cadena vacia al principio de un bufer
(cadena).
\' concuerda con la cadena vacia al final de un bufer.
Las secuencias de escape que son validas en las constantes de cadena
(vea abajo) son tambien legales en las expresiones regulares.
Las clases de caracteres son una nueva caracteristica introducida en el
estandar POSIX. Una clase de caracteres es una notacion especial para
describir listas de caracteres que tienen un atributo especifico, pero
donde los caracteres en si mismos pueden variar entre paises diferentes
y/o entre juegos de caracteres diferentes. Por ejemplo, la nocion de lo
que es un caracter alfanumerico difiere entre los EEUU y Francia.
Una clase de caracteres solo es valida en una expreg dentro de las
llaves de una lista de caracteres. Las clases de caracteres consisten
en [:, una palabra clave que denota la clase, y :]. Estas son las
clases de caracteres definidas por el estandar POSIX.
[:alnum:]
Caracteres alfanumericos.
[:alpha:]
Caracteres alfabeticos.
[:blank:]
Espacio en blanco o tabulador.
[:cntrl:]
Caracteres de control.
[:digit:]
Caracteres numericos.
[:graph:]
Caracteres que son imprimibles y visibles al mismo tiempo. (Un
espacio en blanco es imprimible, pero no visible, mientras que
una a es las dos cosas.)
[:lower:]
Caracteres alfabeticos en minuscula.
[:print:]
Caracteres imprimibles (aquellos que no tienen caracteres de
control.)
[:punct:]
Caracteres de puntuacion (aquellos que no son letras, digitos,
caracteres de control, o caracteres de espaciado.)
[:space:]
Caracteres de espaciado (como el espacio en blanco, el
tabulador, y el salto de pagina, por nombrar algunos.)
[:upper:]
Caracteres alfabeticos en mayuscula.
[:xdigit:]
Caracteres que son digitos hexadecimales.
Por ejemplo, antes del estandar POSIX, para concordar caracteres
alfanumericos, tendria que haber escrito /[A-Za-z0-9]/. Si su juego de
caracteres contiene otros caracteres alfabeticos, esta especificacion
no los hubiera recogido. Usando las clases de caracteres de POSIX,
puede escribir /[[:alnum:]]/, y esto concordaria con todos los
caracteres alfabeticos y numericos de su juego de caracteres.
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 simbolos (llamados elementos
equivalentes) los cuales son representados por mas de un caracter, al
igual que varios caracteres que son equivalentes para propositos de
comparaci'on u ordenaci'on. (Por ejemplo, en Espanol, una ``e'' normal y
una con tilde "a" son equivalentes.)
Simbolos Equivalentes
Un simbolo equivalente es un elemento formado por mas de un
caracter englobado entre [. y .]. Por ejemplo, si ch es un
elemento equivalente, entonces [[.ch.]] es una expresion
regular que se ajusta con este elemento equivalente, mientras
que [ch] es una expresion regular que se ajusta con una c o con
una h.
Clases de Equivalencia
Una clase de quivalencia es un nombre (especifico para una
localizacion determinada) para una lista de caracteres que son
equivalentes. El nombre se engloba entre [= y =]. Por ejemplo,
el nombre e puede ser utilizado para representar a todos estos:
``e,'' ``e,'' y ``e.'' En este caso, [[=e]] es una expresion
regular que se ajusta con
.BR e ,
.BR e , o
.BR e .
Estas caracteristicas son especialmente utiles para las localizaciones
de habla no inglesa. Las funciones de libreria que usa gawk para el
ajuste de expresiones regulares solo reconoce las clases de caracteres
POSIX; no reconocen ni los simbolos equivalentes ni las clases de
equivalencia.
Los operadores \y, \B, \<, \>, \w, \W, \`, y \' son especificos para
gawk; son extensiones basadas en las capacidades de las librerias de
expresiones regulares de GNU.
Varias opciones de la linea de ordenes controlan como gawk interpreta
los caracteres en las expresiones regulares.
Sin opciones
En el caso por defecto, 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.
--posix
Solo se aceptan las expresiones regulares de POSIX, los
operadores de GNU no son considerados especiales. (Por ejemplo,
\w concuerda con el literal w). Las expresiones regulares estan
permitidas.
--traditional
Se aceptan las expresiones regulares de la implementacion
tradicional de 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
([[: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.
--re-interval
Permiten las expresiones de intervalo en las expresiones
regulares, aunque se haya indicado --traditional
Acciones
Las sentencias de las acciones se engloban entre llaves, { y }. Las
sentencias de las acciones consisten en las habituales sentencias de
asignacion, condicionales y bucles que pueden encontrarse en la mayoria
de los lenguajes. Los operadores, sentencias de control, y sentencias
de entrada/salida disponibles son parecidas a las equivalentes de C.
Operadores
Los operadores en AWK, en orden decreciente de precedencia, son
(...) Agrupacion.
$ Referencia a campo.
++ -- Incremento y decremento, tanto en forma prefija como
sufija.
^ Exponenciacion (tambien puede usarse ** , y **= para el
operador de asignacion.)
+ - ! Mas y menos unarios, y negacion logica.
* / % Multiplicacion, division, y resto de division.
+ - Suma y resta.
space Concatenacion de cadenas.
< >
<= >=
!= == Operadores de relacion tradicionales.
~ !~ Cotejo de expresion regular, cotejo negado. NOTA: No use
una expresion regular constante (/pepe/) en la parte
izquierda de una ~ o una !~. Solo usela en la parte
derecha. La expresion /pepe/ ~ exp tiene el mismo
significado que (($0 ~ /foo/) ~ exp). Esto normalmente no
es lo que se pretendia.
in Pertenencia a una tabla.
&& Y logica.
|| O logica.
?: Expresion condicional de C. Tiene la forma expr1 ? expr2 :
expr3. Si expr1 es cierta, el valor de la expresion es
expr2, en caso contrario es expr3. Solo uno de los dos (
expr2 y expr3 ) son evaluados.
= += -=
*= /= %= ^= Asignacion. Tanto las asignaciones absolutas (var = valor)
como las asignaciones de operador (las otras formas) son
aceptadas.
Sentencias de control
Las sentencias de control son las siguientes:
if (condici'on) sentencia [ else sentencia ]
while (condici'on) sentencia
do sentencia while (condici'on)
for (expr1; expr2; expr3) sentencia
for (var in tabla) sentencia
break
continue
delete tabla['indice]
delete tabla
exit [ expresi'on ]
{ sentencias }
Sentencias de E/S
Las sentencias de entrada/salida son las siguientes:
close(fichero) Cerrar fichero (o tuberia, vea mas abajo.)
getline Asignar a $0 el siguiente registro de entrada;
modifica NF, NR, FNR.
getline <fichero Asignar a $0 el siguiente registro de fichero;
modifica NF.
getline var Asignar a var el siguiente registro de entrada;
modifica NR, FNR.
getline var <fichero Asignar a var el siguiente registro de fichero.
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
patron del programa AWK. Si se llega al final de
los datos de entrada, el/los bloque(s) END , si
existen, son ejecutados.
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 FILENAME y ARGIND , FNR
se actualiza a 1, y el procesado comienza de
nuevo por el primer patron del programa AWK. Si
se llega al final de los datos de entrada,
el/los bloque(s) END , si existen, son
ejecutados. NOTA: Versiones antiguas de gawk
usaban next file, como dos palabras. Aunque esta
forma se reconoce todavia, genera un mensaje de
alerta y sera eliminado en futuras versiones.
print Imprime el registro actual. El registro de
salida se termina con el valor de la variable
ORS .
print lista-expr Imprime expresiones. Cada expresion se separa
por el valor de la variable OFS . El registro
de salida se termina con el valor de la variable
ORS .
print lista-expr >fichero
Imprime expresiones en fichero. Cada expresion
se separa por el valor de la variable OFS . El
registro de salida se termina con el valor de la
variable ORS .
printf fmt, lista-expr Dar formato e imprimir.
printf fmt, lista-expr >fichero
Dar formato e imprimir en fichero.
system(l'inea-de-orden) Ejecutar la orden l'inea-de-orden, y devuelve el
valor de salida. (Esto puede no estar
disponible en sistemas no POSIX .)
fflush([fichero]) Descargar cualquier bufer asociado con el
fichero o tuberia de salida abierto. Si no se
especifica fichero , entonces se descarga la
salida estandar. Si fichero es la cadena vacia,
entonces todos los bufers de los ficheros y
tuberias de salida abiertos son descargados.
Tambien se permiten redirecciones de entrada/salida. Para print y
printf, >>fichero anade la salida a fichero, mientras que | orden
escribe en una tuberia. De forma similar, orden | getline escribe
mediante una tuberia en getline. La orden getline retornara 0 en el
final del fichero, y -1 en caso de error.
La sentencia printf
Las versiones AWK de la sentencia printf y de la funcion sprintf()
(vease a continuacion) aceptan la siguiente especificacion para
formatos de conversion:
%c Un caracter ASCII . Si el argumento usado para %c es numerico,
es tratado como un caracter e imprimido. De otro modo, el
argumento se asume que es una cadena, y solo se imprime el
primer caracter de esa cadena.
%d
%i Un numero decimal (la parte entera).
%e
%E Un numero real de coma flotante de la forma [-]d.dddddde[+-]dd.
El formato %E usa E en vez de e.
%f Un numero real de coma flotante de la forma [-]ddd.dddddd.
%g
%G Usese la conversion %e o %f , la que sea mas corta, suprimiendo
los ceros no significativos. El formato %G usa %E en vez de %e.
%o Un numero sin signo en octal (entero.)
%s Una cadena de caracteres.
%x
%X Un numero sin signo en hexadecimal (entero.) El formato %X usa
ABCDEF en vez de abcdef.
%% Un caracter % ; no se utiliza ningun argumento.
Estos son parametros opcionales que pueden ponerse entre el % y la
letra de control:
- La expresion debe ser justificada por la izquierda dentro de su
campo.
espacio
Para conversiones numericas, pone un espacio en blanco como
prefijo en los valores positivos, y un signo negativo en los
valores negativos.
+ EL signo mas, usado antes del modificador de anchura (vea mas
adelante), indica que siempre debe ponerse el signo en las
conversiones numericas, aunque el dato a dar formato sea
positivo. El + anula el modificador de espacio.
# Usa una ``forma alternativa'' para ciertas letras de control.
Para %o, anade un cero inicial. Para %x, y %X, anade un 0x o 0X
inicial para resultados diferentes de cero. Para %e, %E, y %f,
El resultado contendra siempre un punto decimal. Para %g, y %G,
Los ceros al final no seran eliminados del resultado.
0 Un 0 (cero) inicial actua como una bandera, indica que la salida
debe ser rellenada con ceros en vez de con espacios. Esto se
aplica tambien para los formatos de salida no numericos. Esta
bandera solo tiene efecto cuando la anchura del campo es mayor
que el valor a imprimir.
anchura
El campo tiene que ser rellenado hasta alcanzar la anchura
indicada. El campo normalmente sera rellenado con espacios. Si
la bandera 0 se esta usando, sera rellenado con ceros.
.prec Un numero que especifica la precision a usar cuando se imprima.
Para los formatos %e, %E, y %f , esto especifica el numero de
digitos que desea que se impriman a la derecha del punto
decimal. Para los formatos %g, y %G , especifica el numero
maximo de digitos significativos. Para los formatos %d, %o, %i,
%u, %x, y %X , especifica el numero minimo de digitos a
imprimir. Para una cadena, especifica el numero maximo de
caracteres de la cadena que deben ser imprimidos.
Las caracteristicas de anchura y prec dinamicas de las rutinas printf()
del ANSI C tambien son soportadas. Un * en el lugar de las
especificaciones de anchura o de prec causara que sus valores sean
tomados a partir de la lista de argumentos de printf o sprintf().
Nombres especiales de ficheros
Cuando se realiza redireccion de la E/S tanto desde print como de
printf en un fichero, o mediante getline a partir de un fichero, gawk
reconoce internamente ciertos nombres especiales de ficheros. Estos
nombres de ficheros permiten acceder a descriptores de ficheros
abiertos heredados del proceso padre de gawk (normalmente el shell.)
Otros nombres especiales proveen acceso a informacion sobre la
ejecucion del proceso gawk Los nombres de ficheros son:
/dev/pid Leer de este fichero devuelve el ID del proceso actual, en
decimal, terminado con un salto de linea.
/dev/ppid Leer de este fichero devuelve el ID del proceso padre del
actual proceso, en decimal, terminado con un salto de
linea.
/dev/pgrpid Leer de este fichero devuelve el ID del grupo del proceso
actual, en decimal, terminado con un salto de linea.
/dev/user Leer de este fichero devuelve un registro terminado con un
salto de linea. Los campos se separan por espacios en
blanco. $1 el el valor de la llamada a sistema getuid(2) ,
$2 es el valor de la llamada a sistema geteuid(2) , $3 es
el valor de la llamada a sistema getgid(2) , y $4 es el
valor de la llamada a sistema getegid(2) Si hay campos
adicionales, son los IDs de grupo devueltos por
getgroups(2). No todos los sistemas soportan multiples
grupos.
/dev/stdin La entrada estandar.
/dev/stdout La salida estandar.
/dev/stderr La salida de error estandar.
/dev/fd/n El fichero asociado con el descriptor de fichero abierto n.
Son particularmente utiles para los mensajes de error. Por ejemplo:
print ",i Error !" > "/dev/stderr"
donde, de otra manera, tendria que haber usado
print ",i Error !" | "cat 1>&2"
Estos nombres de fichero pueden usarse tambien en la linea de orden
para nombrar ficheros de datos.
Funciones num'ericas
AWK dispone de las siguientes funciones aritmeticas predefinidas:
atan2(y, x) devuelve el arcotangente de y/x en radianes.
cos(expr) devuelve el coseno de expr, la cual esta en radianes.
exp(expr) la funcion exponencial.
int(expr) truncado a entero.
log(expr) logaritmo natural.
rand() devuelve un numero aleatorio entre 0 y 1.
sin(expr) retorna el seno de expr, la cual esta en radianes.
sqrt(expr) raiz cuadrada.
srand([expr]) usa expr como la nueva semilla para el generador de
numeros aleatorios. Si no se indica expr , se usa la hora
del dia. El valor de retorno es la anterior semilla del
generador.
Funciones de cadena
Gawk dispone de las siguientes funciones predefinidas para cadenas:
gensub(r, s, h [, t]) buscar en la cadena objetivo t si hay ajustes
de la expresion regular r. Si h es una cadena
que comienza por g o G, entonces reemplazar
todos los ajustes de r por s. De otro modo, h
es un numero indicando cual de los ajustes de r
debe reemplazarse. Si no se indica t , se usa
$0 . Dentro del texto de reemplazo s, puede
usarse la secuencia \n, donde n es un digito de
1 a 9, para indicar solo el texto que se ha
ajustado con la subexpresion con parentesis
n'esima. La secuencia \0 representa el texto
ajustado completo, al igual que el caracter &.
A diferencia de sub() y gsub(), la cadena
modificada se devuelve como resultado de la
funcion, y la cadena objetivo original no es
modificada.
gsub(r, s [, t]) para cada subcadena que ajuste con la expresion
regular r en la cadena t, substituye la cadena
s, y devuelve el numero de sustituciones. Si
no se ha indicado t , se usa $0. Un & en el
texto de reemplazo es sustituido por el texto
que ha sido ajustado en ese momento. Use \&
para obtener un & literal. Vea AWK Language
Programming para una descripcion mas detallada
sobre las reglas para los & y las barras
invertidas en el texto de reemplazo de sub(),
gsub(), y gensub().
index(s, t) devuelve el indice de la cadena t en la cadena
s, o 0 si t no aparece.
length([s]) devuelve la longitud de la cadena s, o la
longitud de $0 si no se indica s .
match(s, r) devuelve la posicion en s donde aparece la
expresion regular r , o 0 si r no aparece, y
modifica los valores de RSTART y RLENGTH.
split(s, a [, r]) divide la cadena s en la tabla a en la
expresion regular r, y devuelve el numero de
campos. Si se omite r , se usa FS . La tabla a
se borra al principio. La division funciona de
forma identica a la division de campos,
descrita anteriormente.
sprintf(fmt, lista-expr)
imprime lista-expr de acuerdo con fmt, y
devuelve la cadena resultante.
sub(r, s [, t]) igual que gsub(), pero solo se reemplaza la
primera subcadena que ajusta.
substr(s, i [, n]) retorna la subcadena de s que comience por i y
que tenga como mucho n caracteres. Si se omite
n , se usa el resto de s .
tolower(cad) devuelve una copia de la cadena cad, con todos
los caracteres en mayuscula de cad cambiados
por sus correspondientes en minuscula. Los
caracteres no alfabeticos no son modificados.
toupper(cad) devuelve una copia de la cadena cad, con todos
los caracteres en minuscula de cad cambiados
por sus correspondientes en mayuscula. Los
caracteres no alfabeticos no son modificados.
Funciones de tiempo
Teniendo en cuenta que uno de los principales usos de los programas AWK
es el procesamiento de ficheros de registro (log files) que contienen
informacion de registro de tiempo, gawk proporciona las siguientes
funciones para obtener registros de tiempo y darles formato.
systime() devuelve la hora del dia actual como el numero de segundos
desde la Epoca (Medianoche UTC del 1 Enero de 1970 en
sistemas POSIX).
strftime([formato [, timestamp]])
da formato a timestamp de acuerdo con la especificacion en
formato. El timestamp debe tener la misma forma que el
retornado por systime(). Si no aparece timestamp , se
utiliza la hora del dia actual. Si no aparece formato , se
utiliza un formato por defecto equivalente a la salida de
date(1). Vea la especificacion de la funcion strftime() en
ANSI C para estar seguro de las conversiones de formato que
se garantiza que existen. Una version de dominio publico de
strftime(3) y la correspondiente pagina de manual se
distribuyen con gawk; si se uso esa version para compilar
gawk, entonces todas las conversiones descritas en esa pagina
de manual estaran disponibles para gawk.
Constantes de cadena
Las constantes de cadena en AWK son secuencias de caracteres entre
dobles comillas ( " ). Dentro de las cadenas, se reconocen
determinadas secuencias de escape , como en C. Son las siguientes:
\\ Una barra invertida literal.
\a El caracter de ``alerta''; usualmente el caracter ASCII BEL .
\b caracter de borrado.
\f salto de pagina.
\n salto de linea.
\r retorno de carro.
\t tabulador horizontal.
\v tabulador vertical
\xd'igitos hexadecimales
El caracter representado por la cadena de digitos hexadecimales
que sigue a la \x. Como en ANSI C, todos los digitos
hexadecimales siguientes se consideran como parte de la secuencia
de escape. (Esta caracteristica nos deberia dar una idea sobre el
diseno de lenguajes del comite.) Por ejemplo, "\x1B" es el
caracter ASCII ESC (escape).
\ddd El caracter representado por la secuencia de 1, 2 o 3 digitos en
octal. Por ejemplo . "\033" es el caracter ASCII ESC (escape).
\c El caracter c literal.
Las secuencias de escape pueden usarse tambien dentro de constantes de
expresiones regulares (p.ej., /[ \t\f\n\r\v]/ se ajusta con espacios en
blanco).
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. Asi, /a\52b/
es equivalente a /a\*b/.
FUNCIONES
La funciones en AWK se definen de la siguiente manera:
function nombre(lista de par'ametros) { sentencias }
Las funciones se ejecutan cuando son llamadas desde dentro de las
expresiones tanto desde patrones o acciones. Los parametros reales
usados en la llamada a la funcion se usan para instanciar los
parametros formales declarados en la funcion. Las tablas se pasan por
referencia, las otras variables se pasan por valor.
Ya que las funciones no formaban parte originalmente del lenguaje AWK,
el uso de variables locales es un tanto chapucero: Son declaradas como
parametros extra en la lista de parametros. Por costumbre se separan
las variables locales de los parametros reales por espacios en blanco
adicionales en la lista de parametros. Por ejemplo:
function f(p, q, a, b) # a & b son locales
{
.....
}
/abc/ { ... ; f(1, 2) ; ... }
Es necesario que el parentesis izquierdo en una llamada a funcion siga
inmediatamente al nombre de la funcion, sin anadir ningun espacio en
blanco. Esto es necesario para evitar ambiguedades sintacticas con el
operador de concatenacion. Esta restriccion no se aplica a las
funciones predefinidas listadas anteriormente.
Las funciones pueden llamarse las unas a las otras y pueden ser
recursivas. Los parametros usados como variables locales son
inicializados con una cadena vacia y el numero cero en la invocacion de
la funcion.
Si se indico --lint , gawk generara mensajes de alarma sobre llamadas a
funciones no definidas en tiempo de analisis, en vez de en tiempo de
ejecucion. Llamar a una funcion no definida en tiempo de ejecucion es
un error fatal.
Puede usarse la palabra func en vez de function.
EJEMPLOS
Imprimir y ordenar los nombres de ingreso de todos los usuarios:
BEGIN { FS = ":" }
{ print $1 | "sort" }
Contar las lineas de un fichero:
{ nlines++ }
END { print nlines }
Anadir el numero de linea al principio de cada una en el fichero:
{ print FNR, $0 }
Concatenar y numero de linea (una variacion del ejercicio):
{ print NR, $0 }
V'EASE TAMBI'EN
egrep(1), getpid(2), getppid(2), getpgrp(2), getuid(2), geteuid(2),
getgid(2), getegid(2), getgroups(2)
The AWK Programming Language, Alfred V. Aho, Brian W. Kernighan, Peter
J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X.
AWK Language Programming, Edition 1.0, published by the Free Software
Foundation, 1995.
COMPATIBILIDAD POSIX
Un objetivo principal de gawk es la compatibilidad con el estandar
POSIX, y a su vez la compatibilidad con la ultima version del awk de
UNIX . Hasta la fecha, gawk incorpora las siguientes capacidades para
el usuario que no se describen en el libro de AWK, pero que forman
parte de la version de Bell Labs de awk, y se encuentran en el estandar
POSIX .
La opcion -v para asignar variables antes de la ejecucion del programa
es nueva. El libro dice que las asignaciones de variables de la linea
de ordenes ocurririan cuando awk abriera el argumento como un fichero,
lo cual es antes de ejecutar el bloque BEGIN . De todos modos, en
implementaciones mas modernas, cuando una asignacion como esta aparece
antes que ningun nombre de fichero, la asignacion ocurriria antes de
que el bloque BEGIN fuera ejecutado. Las aplicaciones acostumbran a
depender de esta ``caracteristica.'' Cuando awk fue modificado para
acomodarse a su documentacion, se anadio esta opcion para acomodar a
las aplicaciones que dependen de esta vieja caracteristica. (Esta
caracteristica fue aceptada tanto por los desarrolladores de AT&T como
por los de GNU.)
La opcion -W para implementacion de caracteristicas especificas
pertenece al estandar POSIX.
Durante el procesado de argumentos, gawk usa la opcion especial ``--''
para senalar el final de los argumentos. En modo compatibilidad, las
opciones no definidas daran un mensaje de alerta, pero de todos modos
son ignoradas. En operacion normal, estos argumentos son pasados al
programa AWK para que sean procesados.
El libro de AWK no define el valor de retorno de srand(). El estandar
POSIX hace que devuelva la semilla que estaba usando, para permitir
seguir la pista de las secuencias de numeros aleatorios. Por este
motivo, srand() en gawk devuelve igualmente la semilla actual.
Otras caracteristicas nuevas son: El uso de multiples opciones -f (a
partir de MKS awk); la tabla ENVIRON ; las secuencias de escape \a, y
\v (implementadas originalmente en gawk y anadidas en la version de
AT&T); las funciones predefinidas tolower() y toupper() (a partir de
AT&T); y las especificaciones de conversion de ANSI C en printf
(implementadas por primera vez en la version de AT&T).
EXTENSIONES DE GNU
Gawk contiene una serie de extensiones del awk de POSIX. Se describen
en esta seccion. Las extensiones que se describen aqui pueden
desactivarse llamando a gawk con la opcion --traditional .
Las siguientes capacidades de gawk no estan disponibles en el awk de
POSIX.
o La secuencia de escape \x . (Desactivada con --posix.)
o La funcion fflush() . (Desactivada con --posix.)
o Las funciones systime(), strftime(), y gensub() .
o Los nombres de fichero especiales para redireccion de E/S no
son reconocidos.
o Las variables ARGIND, ERRNO, y RT no son especiales.
o La variable IGNORECASE y sus efectos no estan disponibles.
o La variable FIELDWIDTHS y la division de campos de ancho fijo.
o El uso de RS como una expresion regular.
o La habilidad de dividir caracteres individuales usando la
cadena vacia como valor para FS, y como tercer argumento para
split().
o No se realiza busqueda de camino para los ficheros nombrados
mediante la opcion -f . Por ello, la variable de entorno
AWKPATH no es especial.
o El uso de nextfile para abandonar el procesado del fichero de
entrada actual.
o El uso de delete tabla para borrar todo el contenido de una
tabla.
El libro de AWK no define el valor de retorno de la funcion close() .
El close() de gawk devuelve el valor de fclose(3), o pclose(3), cuando
se este cerrando un fichero o una tuberia, respectivamente.
Cuando se invoca a gawk con la opcion --traditional , si el argumento
fs para la opcion -F es ``t'', entonces se asignara a FS el caracter
tabulador. Notese que escribiendo gawk -F\t ... simplemente se
provoca que el shell lo cambie por el literal ``t'', y no pase ``\t'' a
la opcion -F . Dado que es un caso un tanto especial y bastante
desagradable, esta no es la manera por defecto de actuar. Tampoco se
actua de esta manera si se ha especificado --posix . Para tener un
tabulador como separador de campo, es mejor usar el entrecomillado:
gawk -F'\t' ....
CAPACIDADES HIST'ORICAS
Hay dos caracteristicas de implementaciones historicas de AWK que gawk
soporta. Primera, es posible llamar a la funcion predefinida length()
no solamente sin argumento, isino incluso sin parentesis! Por eso,
a = length
es igual que las siguientes
a = length()
a = length($0)
Esta caracteristica se tilda de ``censurable'' en el estandar POSIX, y
gawk generara un mensaje de alerta sobre su uso si se especifica --lint
en la linea de orden.
La otra caracteristica es el uso de las sentencias continue o break
fuera del cuerpo de un bucle while, for, o do . Las implementaciones
tradicionales de AWK han tratado este uso de forma equivalente a la
sentencia next . Gawk soportara este uso si se especifica
--traditional en la linea de orden.
VARIABLES DE ENTORNO
Si POSIXLY_CORRECT existe en el entorno, entonces gawk actua
exactamente como si se hubiera especificado --posix en la linea de
orden. Si se hubiera especificado --lint , gawk generaria un mensaje
de alerta.
La variable de entorno AWKPATH puede usarse para proveer a gawk de una
lista de directorios en la que buscar los ficheros nombrados mediante
las opciones -f y --file .
FALLOS
La opcion -F no es necesaria dada la caracteristica de las asignaciones
de variables por la linea de orden; se mantiene por compatibilidad.
Si su sistema dispone de soporte para el fichero /dev/fd y los
asociados /dev/stdin, /dev/stdout, y /dev/stderr , puede obtener
diferente salida desde gawk a la que podria obtener en un sistema sin
estos ficheros. Cuando gawk interpreta estos ficheros internamente,
sincroniza la salida a la salida estandar con la salida a /dev/stdout,
mientras que en un sistema con estos ficheros, la salida realmente se
envia ficheros abiertos diferentes.
Los programas de un solo caracter sintacticamente incorrectos tienden a
sobrepasar la pila del analizador sintactico, generando un mensaje
bastante poco util. Sorprendentemente, estos programas son dificiles de
diagnosticas en el caso general, y el esfuerzo para hacerlo realmente
no merece la pena.
INFORMACI'ON DE LA VERSI'ON
Esta pagina de manual documenta la version 3.0.2 de gawk.
AUTORES
La version original de awk para UNIX fue disenada e implementada por
Alfred Aho, Peter Weinberger, y Brian Kernighan de AT&T Bell Labs.
Brian Kernighan continua con su mantenimiento y mejora.
Paul Rubin y Jay Fenlason, de la Free Software Foundation, escribio
gawk, para ser compatible con la version original de awk distribuida en
UNIX Seventh Edition. John Woods contribuyo arreglando algunos fallos.
David Trueman, con contribuciones de Arnold Robbins, hizo que gawk
fuera compatible con la nueva version del awk de UNIX. Arnold Robbins
es el actual mantenedor.
La version original para DOS fue realizada por Conrad Kwok y Scott
Garfinkle. Scott Deifik es el mantenedor actual para DOS. Pat Rankin
realizo el paso a VMS, y Michal Jaegermann hizo el paso al Atari ST.
El paso a OS/2 lo realizo Kai Uwe Rommel, con contribuciones y ayudas
de Darrel Hankerson. Fred Fish aporto soporte para el Amiga.
INFORME DE FALLOS
Si encontrara algun fallo en gawk, envie por favor un mensaje
electronico a bug-gnu-utils@prep.ai.mit.edu, con una copia de carbon a
arnold@gnu.ai.mit.edu. Por favor, incluya su sistema operativo y su
revision, la version de gawk, que compilador de C uso para compilarlo,
y el programa de prueba y los datos minimos para reproducir el
problema.
Antes de enviar un informe de fallos, haga por favor dos cosas.
Primero, verifique que dispone de la ultima version de gawk. Muchos
fallos (normalmente bastante sutiles) son arreglados en cada nueva
version, y si la suya esta obsoleta, el problema podria estar ya
arreglado. Segundo, por favor lea detenidamente tanto esta pagina 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
interpretacion del lenguaje.
Sea lo que sea que haga, NO remita un informe de fallo en
comp.lang.awk. Aunque los desarrolladores de 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 electronico anteriores.
RECONOCIMIENTOS
Brian Kernighan de Bell Labs proveyo de una valiosa asistencia durante
las pruebas y la eliminacion de fallos. Le damos las gracias.
PERMISOS DE COPIA
Copyright (C) 1996 Free Software Foundation, Inc.
Se concede permiso para hacer y distribuir copias literales de esta
pagina de manual siempre que se preserven tanto la nota de copyright
como esta nota de permisos en todas las copias.
Se concede permiso para copiar y distribuir versiones modificadas de
esta pagina de manual bajo las condiciones de la copia literal, siendo
los resultados completos del trabajo derivado distribuidos bajo los
terminos de una nota de permisos identica a esta.
Se concede permiso para copiar y distribuir traducciones de esta pagina
de manual a otros idiomas, bajo las anteriores condiciones para
versiones modificadas, exceptuando que esta nota de permisos debe
manifestarse mediante una traduccion aprobada por la Fundacion.
Nota del traductor: Dado que la traduccion de esta nota no esta
aprobada por la Free Software Foundation, se anade la nota original en
Ingles.
COPYING PERMISSIONS
Copyright (C) 1996 Free Software Foundation, Inc.
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.
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).
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.
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.