Patrones y Acciones - AWK

Un programa awk es principalmente compuesto de reglas, cada una consistente en un patrón seguido de una acción. La acción se presenta encerrada entre `{' y `}'. Se podría omitir tanto el patrón como la acción correspondiente, pero por supuesto que no se podrían omitir ambos. Si se omite el patrón, la acción se ejecuta para todas las líneas individuales de la entrada. La omisión de una acción es equivalente a esta acción,

{ print }

la cuál imprime la línea completa.

Los comentarios comienzan con el carácter `#', y continúa hasta el final de la línea. Las líneas en blanco podrían ser usadas para separar las sentencias. Normalmente, una sentencia finaliza con un carácter newline, sin embargo, este no es el caso para las líneas que finalizan con un `,', `{', `?', `:', `&&', o `||'. Las líneas que finalizan en do o else también hacen que la sentencias automáticamente continúen en la siguiente línea.

En otros casos, una línea podría ser continuada finalizandola con un `\', en cuyo caso el newline es ignorado.

Se podrían poner múltiples sentencias en una misma línea separándolas con un `;'. Esto se aplica a ambas partes, las sentencias dentro de la parte de acción de una regla (el caso normal), y a las propias sentencias de la regla.

Patrones


Los patrones awk podrían ser uno de los siguien tes:

/expresión regular / expresión relacional patrón && patrón patrón || patrón
patrón ? patrón : patrón
(patrón)
! patrón patrón1, patrón2 BEGIN
END

BEGIN y END son dos tipos especiales de patrones que no son chequeados contra la entrada. Las partes de acción de todas las reglas BEGIN son fusionadas como si todas las sentencias hubiesen sido escritas en una única regla BEGIN. Son ejecutadas antes de ser leída ninguna entrada. De forma similar, todas las reglas END son fusionadas, y ejecutadas cuando se ha acabado de leer 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 patrón. Las reglas BEGIN y END no pueden tener las partes de acción omitidas.

Para los patrones `/expresión-regular/', la sentencia asociada se ejecuta para cada línea de entrada que encaja con la expresión regular. Las expresiones regulares son las mismas que las utilizadas en egrep, y son resumidas más abajo.

Una expresión regular podría utilizar cualquiera de los operadores definidos más abajo en la sección de acciones. Estas generalmente chequean si ciertos campos encajan con ciertas expresiones regulares.

Los operadores `&&', `||', y `!' son el “y” lógico, “o” lógico y “no” lógico respectivamente como en C. Realizan también la evaluación corta de la expresión, también como en C, y se utilizan para combinar expresiones de patrón más primitivas. Como en la mayoría de los lenguajes, los paréntesis podrían ser usados para cambiar el orden de evaluación.

El operador `?:' es igual que su equivalente en C. Si es igual al primer patrón, entonces el segundo patrón es comparado contra el registro de entrada; si no, el registro de entrada se compara con el tercer patrón. Solamente se produce la comparación con uno de los dos patrones, el segundo o el tercero.

El `patrón1, patrón2' forma un patrón que es llamado un patrón de rango. Encaja con todas las líneas de entrada empezando en una línea que encaje con el patrón1, y continuando hasta una línea que encaje con el patrón2, ambas inclusive. Un patrón de rango no puede ser utilizado como un operando con ninguno de los operadores patrón.

Expresiones Regulares


Las expresiones regulares son un género extendido de egrep. Estas compuestas de caracteres como los siguientes:

c
encaja con el carácter c (asumiendo que c es un carácter sin significado especial en las expresiones regulares).

\c
encaja con el carácter literal c.

.
encaja con cualquier carácter excepto con el newline.

^
encaja con el principio de una línea o una cadena.

$
encaja con el final de una línea o una cadena.

[abc...]
encaja con cualquiera de los carácteres abc... (clase de carácter).

[^abc...]
encaja con cualquier carácter excepto abc... y newline (la inversa de una clase de carácter).

r1|r2
encaja con r1 o r2 (alternativa).

r1r2
encaja con r1, y después r2 (concatenación).

r+
encaja con una o más r's.

r*
encaja con cero o más r's.

r?
encaja con cero o una r.

(r)
encaja con r (agrupación).

Las secuencias de escape permitidas en las constantes cadena son también válidas en las expresiones regulares.

Acciones


Las sentencias de acción están encerradas entre llaves `{' y `}'. Las sentencias de la acción constan de las sentencias de asignación, condicionales, y bucles usuales en la mayoría de los lenguajes. Los operadores, sentencias de control, y sentencias de entrada/salida disponibles son similares a sus homólogas en C.

Operadores


Los operadores en awk, en orden de precedencia creciente son

= += -= *= /= %= ^=

Asignación. Ambas, la asignación absoluta (variable=valor) como la asignación con operador (las otras formas) son soportadas

?:
Una expresión condicional, como en C. Esta tiene la forma expr1 ? expr2 : expr3. Si expr1 es verdadera, el valor de la expresión completa es expr2; si no el valor de la expresión completa es expr3. Solamente una de las dos (expr2 y expr3) es evaluada.

||
“o” lógico.

&&
“y” lógico.

~ !~
Concordancia con expresión regular, no concordancia con expresión regular.

< <= > >= != ==
Los operadores relacionales usuales.

blank
Concatenación de cadenas.

+ -
Suma y resta.

* / %
Multiplicación, división y módulo.

+ - !
Operadores unarios suma y resta y la negación lógica.

^
Exponenciación (`**' podría también ser usado, y `**=' para el operador asignación).

++ --
Incremento y decremento, ambos prefijo y sufijo.

$
Referencia a un campo.

Sentencias de Control

Las sentencias de control son las siguientes:

if (condición) sentencia [ else sentencia ] while (condición) sentencia
do sentencia while (condición)
for (expr1; expr2; expr3) sentencia for (variable in array) sentencia break
continue
delete array[índice] exit [ expresión ]
{ sentencias }

Sentencias de Entrada/Salida


Las sentencias de entrada/salida son las siguientes:

getline
Fija el valor de $0 a partir del siguiente registro de entrada; fija además los valores de las variables NF, NR, FNR.

getline <fichero
Fija el valor de $0 a partir del siguiente registro de fichero; fija el valor de NF.

getline var
Fija el valor de var a partir del siguiente registro de entrada; fija además los valores de las variables NF, FNR.

getline var <fichero
Fija el valor de var a partir del siguiente registro de fichero.

next
Detiene el procesamiento del registro actual. El siguiente registro de entrada se lee y el procesamiento comienza en el primer patrón en el programa awk. Si se alcanza el final de los datos de entrada, la regla/s END si existiese/n son ejecutadas.

print
Imprime el registro actual.

print lista-expresiones
Imprime expresiones.

print lista-expresiones > fichero
Imprime expresiones sobre fichero.

printf format, lista-expresiones
Formatea e imprime la lista de expresiones.

printf format, lista-expresiones > fichero
Formatea e imprime sobre fichero.

También se permiten otras redirecciones de la entrada/salida. Para print y printf, `>> file' añade la salida a fichero, mientras `| command' escribe en un pipe. De una forma similar `command | getline' hace un pipe de la entrada en getline. getline devuelve un 0 al final del fichero, y –1 en caso de error.

Sumario printf


La sentencia de awk printf y la función sprintf acepta los siguientes formatos de especificación de conversión:

%c
Un carácter ASCII. Si el argumento usado para `%c' es numérico, es tratado como un carácter e impreso. Si no, se asume que el argumento es una cadena, y solamente se imprime el primer carácter de esa cadena.

%d
Un número decinal (la parte entera).

%i
También un entero decimal.

%e
Un número en punto flotante de la forma `[-]d.ddddddE[+-]dd'.

%f
Un número punto flotante de la forma [-]ddd.dddddd.

%g
Utilice la conversión `%e' o `%f', cualquiera que sea más corta, con los ceros no significativos suprimidos.

%o
Un número octal sin signo (de nuevo, un entero).

%s
Una cadena de caracteres.

%x
Un número hexadecimal sin signo (un entero).

%X
Como `%x', excepto el uso de `A' hasta `F' en lugar de `a' hasta `f' para el decimal 10 hasta el 15.

%%
Un simple carácter `%'; no se convierte ningún argumento.

Existen parámetros adicionales y opcionales que podrían ir entre el `%' y la letra de control:

-
La expresión debería ser justificada a la izquierda dentro de su campo.

ancho
El campo debería ser relleno hasta este ancho. Si ancho tiene un cero inicial, entonces el campo es rellano con ceros, si no es relleno con espacios en blanco.

.precisión
Un número que indica el ancho máximo de las cadenas o los dígitos a la derecha del punto decimal.

Nombres de ficheros especiales


Cuando se realiza la redirección de I/O desde print o printf a un fichero, o a través de getline desde un fichero, gawk reconoce ciertos nombres de ficheros especiales internamente. Estos nombres de ficheros permiten el acceso a descriptores de ficheros abiertos heredados del proceso padre de gawk (normalmente la shell). Los nombres de fichero son:

`/dev/stdin'
La entrada estándar.

`/dev/stdout'
La salida estándar.

`/dev/stderr'
La salida de error estándar.

`/dev/fd/n'
El fichero determinado por el descriptor de fichero abierto n.

Estos nombres de ficheros podrían también ser usados en la línea de comando para nombrar ficheros de datos.

Funciones Numéricas


awk presenta las siguientes funciones aritméticas predefinidas:

atan2(y, x)
devuelve el arcotangente de y/x en radianes.

cos(expr)
devuelve el coseno en radianes.

exp(expr)
la función exponencial.

int(expr)
trunca a entero.

log(expr)
la función logaritmo natural.

rand()
devuelve un número aleatorio entre 0 y 1.

sin(expr)
devuelve el seno en radianes.

sqrt(expr)
la función raíz cuadrada.

srand(expr)
utiliza expr como una nueva semilla para el generador de números aleatorios. Si no se le proporciona expr, se usa el momento del día. El valor devuelto es la semilla anterior del generador de números aleatorios.

Funciones de Cadenas


awk tiene las siguientes funciones de cadena predefinidas:

gsub(r, s, t)
para cada subcadena que encaja con la expresión regular r en la cadena t, la sustituye por la cadena s, y devuelve el número de sustituciones. Si no se le suministra el valor de t utiliza la línea de entrada completa ($0).

index(s, t)
devuelve el índice de la cadena t dentro de la cadena s, o $0 si t no está presente.

length(s)
devuelve la longitud de la cadena s.

match(s, r)
devuelve la posición dentro de la cadena s donde ocurre la expresión regular r, o 0 si r no está presente, y fija los valores de las variables RSTART y RLENGTH.

split(s, a, r)
parte la cadena s en el array a en función del separador determinado por la expresión regular r, y devuelve el número de campos. Si se omite r, en su lugar se utiliza FS.

sprintf(fmt, lista-expresiones)
imprime lista-expresiones de acuerdo al formato especificado por fmt, y devuelve la cadena resultante.

sub(r, s, t)
actúa igual que gsub, pero solamente la primera subcadena que encaje es sustituida.

substr(s, i, n)
devuelve la subcadena de n caracteres de longitud de s comenzando en la posición i. Si se omite n, devuelve el resto de la cadena s a partir de la posición i.

tolower(str)
devuelve una copia de str, con todos los caracteres en mayúsculas de str convertidos a su correspondiente carácter en minúsculas. Los caracteres que no son alfabéticos permanecen invariables.

toupper(str)
devuelve una copia de str, con todos los caracteres en minúsculas de str convertidos a su correspondiente carácter en mayúsculas. Los caracteres que no son alfabéticos permanecen invariables.

system(linea-comando)
Ejecuta el comando línea-comando, y devuelve el estado de salida.

Constantes de Cadenas


Las cadenas constantes en awk son secuencias de caracteres encerradas entre dobles comillas ("). Dentro de las cadenas, se reconocen ciertas secuencias de escape, como en C. Estas son:

\\
Una barra invertida literal.

\a
El carácter “alerta”, normalmente el carácter ASCII BEL.

\b
Backspace o retroceso.

\f
Formfeed.

\n
Nueva línea.

\r
Retorno de Carro.

\t
Tabulador Horizontal.

\v
Tabulador Vertical.

\xhex digits
El carácter representado por la cadena de dígitos hexadecimales que siguen a la `\x'. Como en ANSI C, todos los dígitos hexadecimales siguientes son considerados como parte de la secuencia de escape. E.g., "\x1B" es una cadena que contiene el carácter ASCII ESC (escape).

\ddd
El carácter representado por la secuencia de 1-, 2- o 3- dígitos de dígitos octales.dígitos. Por lo que, "\033" es también una cadena que contiene el carácter ASCII ESC (escape).

\c
El carácter literal c.

Las secuencias de escape podrían ser también utilizadas dentro de las expresiones regulares constantes (e.g., la expresión regular /[ \t\f\n\r\v]/ encaja con caracteres de espacio en blanco).




Publicar un comentario

0 Comentarios