mandato awk
Finalidad
Busca líneas en archivos que coinciden con un patrón y realiza acciones especificadas en esas líneas.
Sintaxis
awk [ -u ] [ -F Ere ] [ -v Asignación ] ... { -f ProgramFile | 'Programa' } [[ Archivo ... | Asignación ...]] ...
Descripción
El mandato awk utiliza un conjunto de instrucciones proporcionadas por el usuario para comparar un conjunto de archivos, una línea a la vez, con expresiones regulares ampliadas suministradas por el usuario. A continuación, las acciones se realizan en cualquier línea que coincida con las expresiones regulares ampliadas.
La búsqueda de patrón del mandato awk es más general que la del mandato grep y permite al usuario realizar varias acciones en líneas de texto de entrada. El lenguaje de programación de mandatos de awk no requiere compilación y permite al usuario utilizar variables, funciones numéricas, funciones de serie y operadores lógicos.
El mandato awk se ve afectado por las variables de entorno LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_NUMERIC, NLSPATHy PATH .
En este artículo se tratan los temas siguientes:
Entrada para el mandato awk
El mandato awk toma dos tipos de entrada: archivos de texto de entrada e instrucciones de programa.
Archivos de texto de entrada
La búsqueda y las acciones se realizan en archivos de texto de entrada. Los archivos se especifican mediante:
- Especificación de la variable Archivo en la línea de mandatos.
- Modificación de las variables especiales ARGV y ARGC.
- Proporcionando entrada estándar en ausencia de la variable Archivo .
Si se especifican varios archivos con la variable Archivo , los archivos se procesan en el orden especificado.
Instrucciones del programa
Las instrucciones proporcionadas por el usuario controlan las acciones del mandato awk . Estas instrucciones proceden de la variable ` Program' en la línea de mandatos o de un archivo especificado por el distintivo -f junto con la variable ProgramFile . Si se especifican varios archivos de programa, los archivos se concatenan en el orden especificado y se utiliza el orden de instrucciones resultante.
Salida para el mandato awk
El mandato awk produce tres tipos de salida de los datos del archivo de texto de entrada:
- Los datos seleccionados se pueden imprimir en la salida estándar, sin alteración en el archivo de entrada.
- Las partes seleccionadas del archivo de entrada se pueden modificar.
- Los datos seleccionados se pueden modificar e imprimir en la salida estándar, con o sin alterar el contenido del archivo de entrada.
Todos estos tipos de salida se pueden realizar en el mismo archivo. El lenguaje de programación reconocido por el mandato awk permite al usuario redirigir la salida.
Proceso de archivos con registros y campos
Los archivos se procesan de la siguiente manera:
- El mandato awk explora sus instrucciones y ejecuta las acciones especificadas para que se produzcan antes de que se lea el archivo de entrada.
La sentencia BEGIN del lenguaje de programación awk permite al usuario especificar un conjunto de instrucciones que se deben realizar antes de leer el primer registro. Esto es especialmente útil para inicializar variables especiales.
- Se lee un registro del archivo de entrada.
Un registro es un conjunto de datos separados por un separador de registros. El valor predeterminado para el separador de registros es el carácter de nueva línea, que hace que cada línea del archivo sea un registro distinto. El separador de registros se puede cambiar estableciendo la variable especial RS .
- El registro se compara con cada patrón especificado por las instrucciones del mandato awk .
Las instrucciones del mandato pueden especificar que se compare un campo específico dentro del registro. De forma predeterminada, los campos están separados por espacios en blanco (blancos o tabuladores). Cada campo se hace referencia a una variable de campo. Al primer campo de un registro se le asigna la variable $1 , al segundo campo se le asigna la variable $2 , y así sucesivamente. El registro entero se asigna a la variable $0 . El separador de campo se puede cambiar utilizando el distintivo -F en la línea de mandatos o estableciendo Variable especial FS. La variable especial FS se puede establecer en los valores de: en blanco, en un solo carácter o en expresión regular ampliada.
- Si el registro coincide con un patrón, las acciones asociadas a ese patrón se realizan en el registro.
- Después de comparar el registro con cada patrón, y se realizan todas las acciones especificadas, el siguiente registro se lee de la entrada; el proceso se repite hasta que se leen todos los registros del archivo de entrada.
- Si se han especificado varios archivos de entrada, se abre el siguiente archivo y se repite el proceso hasta que se han leído todos los archivos de entrada.
- Después de leer el último registro del último archivo, el mandato awk ejecuta las instrucciones especificadas para que se produzcan después del proceso de entrada.
La sentencia FIN del lenguaje de programación awk permite al usuario especificar acciones que se deben realizar después de leer el último registro. Esto es especialmente útil para enviar mensajes sobre el trabajo realizado por el mandato awk .
El Lenguaje De Programación De Mandatos De Awk
El lenguaje de programación de mandatos de awk consta de sentencias en el formato:
Patrón { Acción }
Si un registro coincide con el patrón especificado o contiene un campo que coincide con el patrón, se realiza la acción asociada. Se puede especificar un patrón sin una acción, en cuyo caso toda la línea que contiene el patrón se escribe en la salida estándar. Se realiza una acción especificada sin un patrón para cada registro de entrada.
Patrones
Hay cuatro tipos de patrones utilizados en la sintaxis del lenguaje de mandatos de awk :
expresiones normales
Las expresiones regulares ampliadas que utiliza el mandato awk son similares a las utilizadas por el mandato grep o egrep . La forma más simple de una expresión regular ampliada es una serie de caracteres encerrados en barras inclinadas. Por ejemplo, suponga un archivo denominadotestfiletenía los siguientes contenidos:
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexisEntrando la siguiente línea de mandatos:
awk '/smi/' testfileimprimirá en la salida estándar de todos los registros que contenían una aparición de la seriesmi. En este ejemplo, el programa'/smi/'para el mandato awk es un patrón sin ninguna acción. La salida es:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexisLos siguientes caracteres especiales se utilizan para formar expresiones regulares ampliadas:
| Carácter | Función |
|---|---|
| + | Especifica que una serie coincide si una o más apariciones del carácter o la expresión regular ampliada que precede a + (más) están dentro de la serie. La línea de mandatos:imprime en salida estándar cualquier registro que contenga una serie con los caracteressmit, seguido de uno o máshy, a continuación, finalizar con los caracteresern. La salida en este ejemplo es: |
| ? | Especifica que una serie coincide si hay cero o una aparición del carácter o una expresión regular ampliada que precede a la? (signo de interrogación) están dentro de la serie. La línea de mandatos:imprime en la salida estándar de todos los registros que contienen los caracteressmit,seguida de cero o una instancia de lah. La salida de este ejemplo es: |
| | | Especifica que una serie coincide si cualquiera de las series separadas por la | (línea vertical) está dentro de la serie. La línea de mandatos:imprime en la salida estándar de todos los registros que contenían la serieallenoalan. La salida en este ejemplo es: |
| ( ) | Agrupa las series en expresiones regulares. La línea de mandatos:imprime en la salida estándar de todos los registros con la serieaeoalleoanneoallnne. La salida en este ejemplo es: |
| { m } | Especifica que una serie coincide si exactamente m apariciones del patrón están dentro de la serie. La línea de mandatos:imprime a la salida estándar |
| {m, } | Especifica que una serie coincide si al menos m apariciones del patrón están dentro de la serie. La línea de mandatos:imprime a la salida estándar: |
| {m, n} | Especifica que una serie coincide si entre m y n, inclusive, las apariciones del patrón están dentro de la serie (donde m < = n). La línea de mandatos:imprime a la salida estándar: |
| [Serie] | Significa que la expresión regular coincide con los caracteres especificados por la variable Serie dentro de los corchetes. La línea de mandatos:imprime en la salida estándar de todos los registros con los caracteressmseguida de cualquier carácter en orden alfabético deapor:h. La salida en este ejemplo es: |
| [^ Serie] | A ^ (caret) dentro de [] (corchetes) y al principio de la serie especificada indica que la expresión regular no coincide con cualquier carácter dentro de los corchetes. Por lo tanto, la línea de mandatos:imprime a la salida estándar: |
| ~,!~ | Significa una sentencia condicional que una variable especificada coincide (tilde) o no coincide (tilde, signo de exclamación) la expresión regular. La línea de mandatos:imprime a la salida estándar de todos los registros cuyo primer campo contenía el caráctern.La salida de este ejemplo es: |
| ^ | Significa el principio de un campo o registro. La línea de mandatos:imprime a la salida estándar de todos los registros con el carácterhcomo primer carácter del segundo campo. La salida de este ejemplo es: |
| $ | Significa el final de un campo o registro. La línea de mandatos:imprime a la salida estándar de todos los registros con el carácterycomo último carácter del segundo campo. La salida de este ejemplo es: |
| . (punto) | Significa cualquier carácter excepto el carácter de nueva línea de terminal al final de un espacio. La línea de mandatos:imprime en la salida estándar de todos los registros con los caracteresay e separados por dos caracteres. La salida de este ejemplo es: |
| *(asterisco) | Significa cero o más de cualquier carácter. La línea de mandatos:imprime en la salida estándar de todos los registros con los caracteresay e separados por cero o más caracteres. La salida de este ejemplo es: |
| \ (barra inclinada invertida) | El carácter de escape. Cuando precede a cualquiera de los caracteres que tienen un significado especial en expresiones regulares ampliadas, el carácter de escape elimina cualquier significado especial para el carácter. Por ejemplo, la línea de mandatos:coincidiría con el patrón //, ya que las barras invertidas niegan el significado habitual de la barra inclinada como delimitador de la expresión regular. Para especificar la barra inclinada invertida como un carácter, utilice una doble barra inclinada invertida. Consulte el siguiente elemento en las secuencias de escape para obtener más información sobre la barra inclinada invertida y sus usos. |
Secuencias de escape reconocidas
El mandato awk reconoce la mayoría de las secuencias de escape utilizadas en los convenios de lenguaje C, así como varias que se utilizan como caracteres especiales por el propio mandato awk . Las secuencias de escape son:
| Secuencia de escape | Carácter representado |
|---|---|
| \" | Marca \" (comillas) |
| \/ | /(barra inclinada) |
| \ddd | Carácter cuya codificación está representada por un entero octal de uno, dos o tres dígitos, donde d representa un dígito octal |
| \\ | \ (barra inclinada invertida) |
| \a | Carácter de alerta |
| \b | carácter de retroceso |
| \f | Carácter de alimentación de formulario |
| \n | Carácter de nueva línea (consulte la nota siguiente) |
| \r | Carácter de retorno de carro |
| \t | carácter de tabulación |
| \v | Pestaña vertical. |
Nota: Excepto en las funciones incorporadas de gsub, match, splity Subartículo , la coincidencia de expresiones regulares ampliadas se basa en registros de entrada. Los caracteres de separador de registro (el carácter de nueva línea por omisión) no se pueden incluir en la expresión y ninguna expresión coincide con el carácter de separador de registro. Si el separador de registros no es el carácter de nueva línea, el carácter de nueva línea se puede emparejar. En las cuatro funciones incorporadas especificadas, la coincidencia se basa en series de texto, y cualquier carácter (incluido el separador de registros) se puede incluir en el patrón para que el patrón coincida con el carácter adecuado. Sin embargo, en todas las expresiones regulares que coinciden con el mandato awk , el uso de uno o más caracteres NULL en el patrón produce resultados no definidos.
Expresiones relacionales
Los operadores relacionales < (menor que), > (mayor que), < = (menor o igual que), > = (mayor o igual que), = = (igual a), y! = (no igual a) se puede utilizar para formar patrones. Por ejemplo, el patrón:
$1 < $4coincide con los registros donde el primer campo es menor que el cuarto campo. Los operadores relacionales también trabajan con valores de serie. Por ejemplo:
$1 =! "q"coincide con todos los registros donde el primer campo no es unq. Los valores de serie también pueden coincidir en valores de clasificación. Por ejemplo:
$1 >= "d"coincide con todos los registros donde el primer campo se inicia con un carácter que esa,b,cod. Si no se proporciona ninguna otra información, las variables de campo se comparan como valores de serie.
Combinaciones de patrones
Los patrones se pueden combinar utilizando tres opciones:
- Los rangos se especifican mediante dos patrones separados por una, (coma). Las acciones se realizan en cada registro empezando por el registro que coincide con el primer patrón, y continuando a través de e incluyendo el registro que coincide con el segundo patrón. Por ejemplo:
coincide con el registro que contiene la seriebegin, y cada registro entre éste y el registro que contiene la serieend, incluido el registro que contiene la serieend./begin/,/end/ - Paréntesis () patrones de grupo juntos.
- Los operadores booleanos | | (o), & & (y), y! (no) combine patrones en expresiones que coincidan si se evalúan como verdaderas, de lo contrario no coinciden. Por ejemplo, el patrón:
coincide con los registros donde se encuentra el primer campoaly el segundo campo es123.$1 == "al" && $2 == "123"
Patrones BEGIN y END
Las acciones especificadas con el patrón BEGIN se realizan antes de que se lea cualquier entrada. Las acciones especificadas con el patrón FIN se realizan después de que se haya leído toda la entrada. Se permiten varios patrones BEGIN y FIN y se procesan en el orden especificado. Un patrón FIN puede preceder a un patrón de BEGIN dentro de las sentencias del programa. Si un programa sólo consta de sentencias BEGIN , las acciones se realizan y no se lee ninguna entrada. Si un programa sólo consta de sentencias FIN , se lee toda la entrada antes de realizar cualquier acción.
Acciones
Existen varios tipos de sentencias de acción:
- Declaraciones de acción
- Built-in Functions
- funciones definidas por el usuario
- Conditional Statements
- Acciones de producción
Declaraciones de acción
Las sentencias de acción se incluyen en { } (llaves). Si las sentencias se especifican sin un patrón, se realizan en cada registro. Se pueden especificar varias acciones dentro de las llaves, pero deben estar separadas por caracteres de nueva línea o; (punto y coma), y las sentencias se procesan en el orden en que aparecen. Las sentencias de acción incluyen:
- Declaraciones aritméticas
- Los operadores matemáticos + (más),-(menos),/(división), ^ (exponenciación), * (multiplicación),% (módulo) se utilizan en el formato:
Expression Operator ExpressionAsí, la declaración:
$2 = $1 ^ 3asigna el valor del primer campo elevado a la tercera potencia al segundo campo.
- Declaraciones unarias
- El unary - (menos) y unary + (plus) funcionan como en el lenguaje de programación C:
+Expression or -Expression
- Declaraciones de incremento y decremento
- Las declaraciones de preincremento y predecremento funcionan como en el lenguaje de programación C:
++Variable or --VariableLas declaraciones post-incremento y post-decremento funcionan como en el lenguaje de programación C:
Variable++ or Variable--
- Sentencias de asignación
- Los operadores de asignación + = (adición),-= (resta),/= (división) y * = (multiplicación) operan como en el lenguaje de programación C, con el formato:
Variable += ExpressionVariable -= ExpressionVariable /= ExpressionVariable *= ExpressionPor ejemplo, la sentencia:
$1 *= $2Multiplica la variable de campo $1 por la variable de campo $2 y luego asigna el nuevo valor a $1.
Los operadores de asignación ^ = (exponenciación) y% = (módulo) tienen el formato:
Variable1^=Expression1Y
Variable2%=Expression2y son equivalentes a las sentencias de lenguaje de programación C:
Variable1=pow(Variable1, Expression1)Y
Variable2=fmod(Variable2, Expression2)dondepowes la subrutina pow yfmodes la subrutina de fmod .
- Sentencias de concatenación de series
- Los valores de serie se pueden concatenar al indicarlos de lado a lado. Por ejemplo:
$3 = $1 $2asigna la concatenación de las series en las variables de campo $1 y $2 a la variable de campo $3.
Built-in Functions
El lenguaje de mandatos de awk utiliza funciones aritméticas, funciones de serie y funciones generales. La sentencia de cierre de subrutina es necesaria si tiene la intención de escribir un archivo y, a continuación, leerlo más tarde en el mismo programa.
Funciones aritméticas
Las siguientes funciones aritméticas realizan las mismas acciones que las subrutinas de lenguaje C con el mismo nombre:
| Elemento | Descripción |
|---|---|
| atan2( y, x ) | Devuelve arcotangente de y/x. |
| cos ( x ) | Devuelve coseno de x; x está en radianes. |
| pecado ( x ) | Devuelve el pecado de x; x está en radianes. |
| exp ( x ) | Devuelve la función exponencial de x. |
| log ( x ) | Devuelve el logaritmo natural de x. |
| sqrt ( x ) | Devuelve la raíz cuadrada de x. |
| int ( x ) | Devuelve el valor de x truncado a un entero. |
| rand ( ) | Devuelve un número aleatorio n, con 0 < = n < 1. |
| srand ( [Expr] ) | Establece el valor de semilla para la función rand en el valor del parámetro Expr , o utilice la hora del día si se omite el parámetro Expr . Se devuelve el valor de semilla anterior. |
Funciones de serie
Las funciones de serie son:
| Elemento | Descripción |
|---|---|
| gsub ( EI, Repl, [ En ] ) | Realiza exactamente como la función Subartículo , excepto que se sustituyen todas las apariciones de la expresión regular. |
| sub ( EI, Repl, [ En ] ) | Sustituye la primera aparición de la expresión regular ampliada especificada por el parámetro EI en la serie especificada por el parámetro En con la serie especificada por el parámetro Repl . La función Subartículo devuelve el número de sustituciones. Una & (ampersand) que aparece en la serie especificada por el parámetro Repl se sustituye por la serie del parámetro En que coincide con la expresión regular ampliada especificada por el parámetro EI . Si no se especifica ningún parámetro En , el valor predeterminado es todo el registro (la variable de registro $0 ). |
| índice ( String1, String2 ) | Devuelve la posición, la numeración de 1, dentro de la serie especificada por el parámetro String1 donde se produce la serie especificada por el parámetro String2 . Si el parámetro String2 no se produce en el parámetro String1 , se devuelve un 0 (cero). |
| longitud [(Serie)] | Devuelve la longitud, en caracteres, de la serie especificada por el parámetro Serie . Si no se da ningún parámetro Serie , se devuelve la longitud de todo el registro (la variable de registro $0 ). |
| blength [(Serie)] | Devuelve la longitud, en bytes, de la serie especificada por el parámetro Serie . Si no se da ningún parámetro Serie , se devuelve la longitud de todo el registro (la variable de registro $0 ). |
| substr ( Serie, M, [ N ] ) | Devuelve una subserie con el número de caracteres especificado por el parámetro N . La subserie se toma de la serie especificada por el parámetro Serie , empezando por el carácter en la posición especificada por el parámetro M . El parámetro M se especifica con el primer carácter del parámetro Serie como número 1. Si no se especifica el parámetro N , la longitud de la subserie será desde la posición especificada por el parámetro M hasta el final del parámetro Serie. |
| match ( Serie, EI ) | Devuelve la posición, en caracteres, de 1, en la serie especificada por el parámetro Serie donde se produce la expresión regular ampliada especificada por el parámetro EI , o bien devuelve un 0 (cero) si el parámetro EI no se produce. La variable especial RSTART se establece en el valor de retorno. La variable especial RLENGTH se establece en la longitud de la cadena coincidente, o en -1 (uno negativo) si no se encuentra ninguna coincidencia. |
| División ( Serie, A, [EI] ) | Divide la serie especificada por el parámetro Serie en elementos de matriz A[1], A[2],.. ., A[n], y devuelve el valor de la variable n . La separación se realiza con la expresión regular ampliada especificada por el parámetro EI o con el separador de campo actual (la variable especial FS ) si no se da el parámetro EI . Los elementos de la matriz A se crean con valores de serie, a menos que el contexto indique que un elemento determinado también debe tener un valor numérico. |
| tolower ( Serie ) | Devuelve la serie especificada por el parámetro Serie , con cada carácter en mayúsculas en la serie cambiada a minúsculas. La correlación en mayúsculas y minúsculas se define mediante la categoría LC_CTYPE del entorno local actual. |
| toupper ( Serie ) | Devuelve la serie especificada por el parámetro Serie , con cada carácter en minúsculas de la serie cambiada a mayúsculas. La correlación en mayúsculas y minúsculas se define mediante la categoría LC_CTYPE del entorno local actual. |
| sprintf (Formato, Expr, Expr, . . . ) | Formatea las expresiones especificadas por los parámetros Expr de acuerdo con la serie de formato de subrutina printf especificada por el parámetro Formato y devuelve la serie resultante. |
Funciones generales
Las funciones generales son:
| Elemento | Descripción |
|---|---|
| cierre ( Expresión ) | Cierre el archivo o conducto abierto por una sentencia imprimir o printf o una llamada a la función getline con el mismo parámetro Expresión de valor de serie. Si el archivo o el conducto se cierra correctamente, se devuelve un 0; de lo contrario, se devuelve un valor distinto de cero. La sentencia cerrar es necesaria si tiene la intención de escribir un archivo y, a continuación, lea el archivo más adelante en el mismo programa. |
| sistema (Comando ) | Ejecuta el mandato especificado por el parámetro Comando y devuelve su estado de salida. Equivalente a la subrutina sistema . |
| Expresión | getline [ Variable ] | Lee un registro de entrada de una corriente que se realiza por conducto de la salida de un mandato especificado por el parámetro Expresión y asigna el valor del registro a la variable especificada por el parámetro Variable . La corriente se crea si no hay ninguna corriente abierta actualmente con el valor del parámetro Expresión como su nombre de mandato. La corriente creada es equivalente a una creada por una llamada a la subrutina popen con el parámetro Comando tomando el valor del parámetro Expresión y el parámetro Modo establecido en un valor de r. Cada llamada subsiguiente a la función getline lee otro registro, siempre y cuando la ruta permanezca abierta y el parámetro Expresión se evalúe en la misma serie. Si no se especifica un parámetro Variable , la variable de registro $0 y la variable especial NF se establecen en el registro leído de la ruta. |
| getline [ Variable ] < Expresión | Lee el siguiente registro de entrada del archivo denominado por el parámetro Expresión y establece la variable especificada por el parámetro Variable en el valor del registro. Cada llamada subsiguiente a la función getline lee otro registro, siempre y cuando la ruta permanezca abierta y el parámetro Expresión se evalúe en la misma serie. Si no se especifica un parámetro Variable , la variable de registro $0 y la variable especial NF se establecen en el registro leído de la ruta. |
| getline [ Variable ] | Establece la variable especificada por el parámetro Variable en el siguiente registro de entrada del archivo de entrada actual. Si no se especifica ningún parámetro Variable , la variable de registro $0 se establece en el valor del registro y también se establecen las variables especiales NF, NRy FNR . |
Nota: Todas las formas de la función getline devuelven 1 en caso de entrada correcta, cero en caso de fin de archivo y -1 en caso de error.
funciones definidas por el usuario
Las funciones definidas por el usuario se declaran en el formato siguiente:
function Name (Parameter, Parameter,...) { Statements }Se puede hacer referencia a una función en cualquier lugar de un programa de mandatos de awk y su uso puede preceder a su definición. El ámbito de la función es global.
Los parámetros de función pueden ser escalares o matrices. Los nombres de parámetros son locales para la función; todos los demás nombres de variables son globales. No se debe utilizar el mismo nombre para distintas entidades; por ejemplo, no se debe duplicar un nombre de parámetro como nombre de función o variable especial. Las variables con ámbito global no deben compartir el nombre de una función. Los escalares y las matrices no deben tener el mismo nombre en el mismo ámbito.
El número de parámetros de la definición de función no tiene que coincidir con el número de parámetros utilizados cuando se llama a la función. Los parámetros formales sobrantes se pueden utilizar como variables locales. Los parámetros escalares adicionales se inicializan con un valor de serie equivalente a la serie vacía y un valor numérico de 0 (cero); los parámetros de matriz adicionales se inicializan como matrices vacías.
Al invocar una función, no se coloca ningún espacio en blanco entre el nombre de función y el paréntesis de apertura. Las llamadas de función pueden ser anidadas y recursivas. Al volver de cualquier llamada de función anidada o recursiva, los valores de todos los parámetros de la función de llamada no se modificarán, excepto para los parámetros de matriz pasados por referencia. La sentencia return se puede utilizar para devolver un valor.
En una definición de función, los caracteres de nueva línea son opcionales antes de la apertura { (brace) and after the closing } (brace).
Un ejemplo de una definición de función es:
function average ( g,n)
{
for (i in g)
sum=sum+g[i]
avg=sum/n
return avg
} El promedio de función se pasa una matriz,g, y una variable,n, con el número de elementos de la matriz. La función obtiene entonces un promedio y lo devuelve.
Conditional Statements
La mayoría de las sentencias condicionales del lenguaje de programación de mandatos de awk tienen la misma sintaxis y funcionan como sentencias condicionales en el lenguaje de programación C. Todas las sentencias condicionales permiten el uso de { } (llaves) para agrupar sentencias. Se puede utilizar una nueva línea opcional entre la parte de expresión y la parte de sentencia de la sentencia condicional, y las nuevas líneas o; (punto y coma) se utilizan para separar varias sentencias en { } (llaves). Seis sentencias condicionales en lenguaje C son:
| Elemento | Descripción |
|---|---|
| if | Requiere la sintaxis siguiente: if ( Expresión ) { Statement} [ else Acción ] |
| while | Requiere la sintaxis siguiente: while ( Expresión ) { Sentencia } |
| DURANTE | Requiere la sintaxis siguiente: for ( Expresión ; Expresión ; Expresión ) { Sentencia } |
| break | Hace que el bucle de programa se pueda salir cuando se utiliza la sentencia Interrupción en una sentencia mientras que o para . |
| continue | Hace que el bucle de programa se mueva a la siguiente iteración cuando se utiliza la sentencia continuar en una sentencia mientras que o para . |
Cinco sentencias condicionales en el lenguaje de programación de mandatos de awk que no siguen las reglas de lenguaje C son:
| Elemento | Descripción |
|---|---|
| ... en | Requiere la sintaxis siguiente: for ( Variable en Array ) { Sentencia } La sentencia para...En establece el parámetro Variable en cada valor de índice de la variable Matriz , un índice a la vez y en ningún orden en particular, y realiza la acción especificada por el parámetro Declaración con cada iteración. Consulte la sentencia suprimir para ver un ejemplo de una sentencia para...En . |
| si...en | Requiere la sintaxis siguiente: if ( Variable en Matriz ) { Sentencia } La sentencia si...En busca la existencia del elemento Matriz . La sentencia se realiza si se encuentra el elemento Matriz . |
| suprimir | Requiere la sintaxis siguiente: suprimir Matriz [ Expresión ] La sentencia suprimir suprime tanto el elemento de matriz especificado por el parámetro Matriz como el índice especificado por el parámetro Expresión . Por ejemplo, las sentencias: suprimiría todos los elementos de lag[]matriz RAID. |
| Salir | Requiere la sintaxis siguiente: Salida [ Expresión ] La sentencia Salida invoca primero todas las acciones de FIN en el orden en que se producen y, a continuación, termina el mandato awk con un estado de salida especificado por el parámetro Expresión . No se invocan acciones FIN posteriores si la sentencia Salida se produce dentro de una acción FIN . |
| # | Requiere la sintaxis siguiente: # Comentario La sentencia # coloca comentarios. Los comentarios siempre deben terminar con una nueva línea, pero pueden comenzar en cualquier lugar de una línea. |
| siguiente | Detiene el proceso del registro de entrada actual y continúa con el siguiente registro de entrada. |
Sentencias de salida
Dos sentencias de salida en el lenguaje de programación de mandatos de awk son:
| Elemento | Descripción |
|---|---|
| imprimir | Requiere la sintaxis siguiente: print [ ExpressionList ] [ Redirección ] [ Expresión ] La sentencia print escribe el valor de cada expresión especificada por el parámetro ExpressionList en la salida estándar. Cada expresión está separada por el valor actual de la variable especial OFS y cada registro termina por el valor actual de la variable especial OORS . La salida se puede redirigir utilizando el parámetro Redirección , que puede especificar las tres redirecciones de salida con el > (mayor que), > > (doble mayor que) y el | (conducto). El parámetro Redirección especifica cómo se redirige la salida y el parámetro Expresión es un nombre de vía de acceso a un archivo (cuando el parámetro Redirección es > o > >) o el nombre de un mandato (cuando el parámetro Redirección es un |). |
| printf | Requiere la sintaxis siguiente: printf Formato [, ExpressionList ] [ Redirección ] [ Expresión ] La sentencia printf escribe en la salida estándar las expresiones especificadas por el parámetro ExpressionList en el formato especificado por el parámetro Format . La sentencia printf funciona exactamente igual que el mandato printf , excepto elcespecificación de conversión (%c). Los parámetros Redirección y Expresión funcionan igual que en la sentencia imprimir . Para lacespecificación de conversión: si el argumento tiene un valor numérico, el carácter cuya codificación es ese valor será la salida. Si el valor es cero o no es la codificación de ningún carácter en el juego de caracteres, el comportamiento no está definido. Si el argumento no tiene un valor numérico, el primer carácter del valor de serie será la salida; si la serie no contiene ningún carácter, el comportamiento no está definido. |
Nota: Si el parámetro Expresión especifica un nombre de vía de acceso para el parámetro Redirección , el parámetro Expresión debe especificarse entre comillas dobles para asegurarse de que se trata como una serie.
Variables
Las variables pueden ser escalares, variables de campo, matrices o variables especiales. Los nombres de variable no pueden empezar por un dígito.
Las variables se pueden utilizar sólo haciendo referencia a ellas. Con la excepción de los parámetros de función, no se declaran explícitamente. Las variables escalares no inicializadas y los elementos de matriz tienen un valor numérico de 0 (cero) y un valor de serie de la serie nula ("").
Las variables toman valores numéricos o de cadena según el contexto. Cada variable puede tener un valor numérico, un valor de serie o ambos. Por ejemplo:
x = "4" + "8"asigna el valor de12a la variablex. Para las constantes de cadena, las expresiones se deben encerrar en "" (comillas dobles).
No hay conversiones explícitas entre números y series. Para forzar que una expresión se trate como un número, añada 0 (cero) a la misma. Para forzar que una expresión se trate como una serie, añada una serie nula ("").
Variables de campo
Las variables de campo se designan mediante un $ (signo de dólar) seguido de una expresión numérica o numérica. Al primer campo de un registro se le asigna la variable $1 , el segundo campo se asigna a la variable $2 , y así sucesivamente. La variable de campo $0 se asigna a todo el registro. Se pueden crear nuevas variables de campo asignándoles un valor. La asignación de un valor a un campo no existente, es decir, cualquier campo mayor que el valor actual de la variable de campo $NF , fuerza la creación de cualquier campo que intervenga (establecido en la serie nula), aumenta el valor de la variable especial NF y fuerza el valor de la variable de registro $0 a volver a calcular. Los nuevos campos están separados por el separador de campo actual (que es el valor de la variable especial FS ). Los espacios en blanco y los separadores son los separadores de campo predeterminados. Para cambiar el separador de campos, utilice el distintivo -F o asigne a la variable especial FS un valor distinto en el programa de mandatos de awk .
Arrays
Las matrices están inicialmente vacías y sus tamaños cambian dinámicamente. Las matrices se representan mediante una variable con subíndices en [] (corchetes). Los subíndices, o identificadores de elemento, pueden ser números de series, que proporcionan un tipo de capacidad de matriz asociativa. Por ejemplo, el programa:
/red/ { x["red"]++ }
/green/ { y["green"]++ }los incrementos de recuentos para ambosredcontador y elgreencontador.
Las matrices se pueden indexar con más de un subíndice, similar a las matrices multidimensionales en algunos lenguajes de programación. Dado que las matrices de programación para el mandato awk son realmente unidimensionales, los subíndices separados por comas se convierten a una sola serie concatenando los valores de serie de las expresiones separadas, con cada expresión separada por el valor de la variable de entorno SUBSEP . Por lo tanto, las dos operaciones de índice siguientes son equivalentes:
x[expr1, expr2,...exprn]Y
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]Cuando se utiliza el operador En , se debe contener un valor de Índice multidimensional entre paréntesis. Excepto para el operador En , cualquier referencia a un elemento de matriz no existente crea automáticamente ese elemento.
Variables especiales
Las siguientes variables tienen un significado especial para el mandato awk :
| Elemento | Descripción |
|---|---|
| ARGC | El número de elementos de la matriz ARGV . Este valor se puede modificar. |
| ARGV | La matriz con cada miembro que contiene una de las variables de archivo o variables de asignación, tomados en orden de la línea de comandos, y numerados de 0 (cero) a ARGC -1. A medida que finaliza cada archivo de entrada, el siguiente miembro de la matriz ARGV proporciona el nombre del siguiente archivo de entrada, a menos que:
|
| CONVFMT | El formato printf para convertir números a series (excepto las sentencias de salida, donde se utiliza la variable especial OFMT ). El valor predeterminado es "%.6g". |
| ENVIRON | Una matriz que representa el entorno bajo el que funciona el mandato awk . Cada elemento de la matriz tiene el formato: ENVIRON [ " NombreVariableEntorno " ] = EnvironmentVariableValue Los valores se establecen cuando el mandato awk empieza a ejecutarse y ese entorno se utiliza hasta el final de la ejecución, independientemente de cualquier modificación de la variable especial ENVIRON . |
| filename | El nombre de vía de acceso del archivo de entrada actual. Durante la ejecución de una acción de BEGIN , el valor de NOMBREARCHIVO no está definido. Durante la ejecución de una acción FIN , el valor es el nombre del último archivo de entrada procesado. |
| FNR | El número del registro de entrada actual en el archivo actual. |
| FS | El separador de campo de entrada. El valor predeterminado es un espacio en blanco. Si el separador de campo de entrada es un espacio en blanco, cualquier número de espacios definidos por el entorno local puede separar campos. La variable especial FS puede tomar dos valores adicionales:
|
| NF | El número de campos del registro actual, con un límite de 99. Dentro de una acción BEGIN , la variable especial NF no está definida a menos que se haya emitido previamente una función getline sin un parámetro Variable . Dentro de una acción FIN , la variable especial NF conserva el valor que tenía para el último registro leído, a menos que se emita una función getline posterior, redirigida, sin un parámetro Variable antes de entrar la acción FIN . |
| NR | El número del registro de entrada actual. Dentro de una acción BEGIN el valor de la variable especial NR es 0 (cero). Dentro de una acción FIN , el valor es el número del último registro procesado. |
| OFMT | El formato printf para convertir números a series en sentencias de salida. El valor predeterminado es "% .6g". |
| OFS | El separador de campo de salida (el valor predeterminado es un espacio). |
| OORS | El separador de registro de salida (el valor predeterminado es un carácter de nueva línea). |
| LONGITUD | La longitud de la serie que coincide con la función match . |
| RS | Separador de registro de entrada (el valor predeterminado es un carácter de nueva línea). Si la variable especial RS es nula, los registros se separan mediante secuencias de una o más líneas en blanco; las líneas en blanco iniciales o finales no dan como resultado registros vacíos al principio o al final de la entrada; y el carácter de nueva línea siempre es un separador de campo, independientemente del valor de la variable especial FS . |
| RSTART | La posición inicial de la serie que coincide con la función match , que es de 1. Equivalente al valor de retorno de la función match . |
| SUBSEP | Separa varios subíndices. El valor predeterminado es \031. |
Distintivos
| Elemento | Descripción |
|---|---|
| -f ProgramFile | Obtiene instrucciones para el mandato awk del archivo especificado por la variable ProgramFile . Si el distintivo -f se especifica varias veces, la concatenación de los archivos, en el orden especificado, se utilizará como el conjunto de instrucciones. |
| -u | Muestra la salida en una modalidad sin almacenamiento intermedio. Si se utiliza este distintivo, el mandato awk no almacenamiento intermedio de la salida. En su lugar, muestra la salida instantáneamente. De forma predeterminada, el mandato awk muestra la salida en una modalidad con almacenamiento intermedio. |
| -F EI | Utiliza la expresión regular ampliada especificada por la variable EI como separador de campo. El separador de campos predeterminado es un espacio en blanco. |
| -v Asignación | Asigna un valor a una variable para el lenguaje de programación del mandato awk . El parámetro Asignación está en la forma de Nombre = Valor. La parte Nombre especifica el nombre de la variable y puede ser cualquier combinación de caracteres de subrayado, dígitos y caracteres alfabéticos, pero debe empezar por un carácter alfabético o un carácter de subrayado. La parte Valor también se compone de caracteres de subrayado, dígitos y caracteres alfabéticos, y se trata como si fuera precedida y seguida de un " (carácter de comillas dobles, similar a un valor de serie). Si la parte Valor es numérica, a la variable también se le asignará el valor numérico. La asignación especificada por el distintivo -v se produce antes de que se ejecute cualquier parte del programa del mandato awk , incluida la sección BEGIN . |
| Asignación | Asigna un valor a una variable para el lenguaje de programación del mandato awk . Tiene el mismo formato y función que la variable Asignación con el distintivo -v , excepto el tiempo que se procesa cada uno. El parámetro Asignación se procesa justo antes del archivo de entrada (especificado por la variable Archivo ) que lo sigue en la línea de mandatos. Si el parámetro Asignación se especifica justo antes del primero de varios archivos de entrada, las asignaciones se procesan justo después de las secciones BEGIN (si las hay). Si se produce un parámetro Asignación después del último archivo, la asignación se procesa antes que las secciones FIN (si las hay). Si no se especifica ningún archivo de entrada, las asignaciones se procesan en la entrada estándar. |
| Archivo | Especifica el nombre del archivo que contiene la entrada para el proceso. Si no se especifica ninguna variable Archivo , o si se especifica un signo - (menos), se procesa la entrada estándar. |
| 'Programa' | Contiene las instrucciones para el mandato awk . Si no se especifica el distintivo -f , la variable Programa debe ser el primer elemento de la línea de mandatos. Debería estar preparado por '' (comillas simples). |
Estado de salida
Este mandato devuelve los siguientes valores de salida:
| Elemento | Descripción |
|---|---|
| 0 | Finalización satisfactoria. |
| >0 | Se ha producido un error. |
Puede alterar el estado de salida dentro del programa utilizando la sentencia condicional Salida [ Expresión ] .
Ejemplos
- Para visualizar las líneas de un archivo que tienen más de 72 caracteres, entre:
Esto selecciona cada línea de lachapter1que tiene más de 72 caracteres y escribe estas líneas en la salida estándar, porque no se ha especificado ningún Acción . Un carácter de tabulación se cuenta como 1 byte.awk 'length >72' chapter1 - Para mostrar todas las líneas entre las palabras startystop,inclusión "start"y "stop",Intro:
awk '/start/,/stop/' chapter1 - Para ejecutar un programa de mandatos de awk ,sum2.awk,que procesa el archivo,chapter1, especifique:
El siguiente programa,sum2.awk, calcula la suma y el promedio de los números en la segunda columna del archivo de entrada,chapter1:awk -f sum2.awk chapter1
La primera acción añade el valor del segundo campo de cada línea a la variablesum. Todas las variables se inicializan en el valor numérico de 0 (cero) al referenciarse por primera vez. El patrón FIN antes de la segunda acción hace que esas acciones se realicen después de que se haya leído todo el archivo de entrada. La variable especial NR , que se utiliza para calcular el promedio, es una variable especial que especifica el número de registros que se han leído.{ sum += $2 } END { print "Sum: ", sum; print "Average:", sum/NR; } - Para imprimir los dos primeros campos en orden opuesto, especifique:
awk '{ print $2, $1 }' chapter1 - El siguiente programa de awk
imprime los dos primeros campos del archivochapter2con campos de entrada separados por comas y/o blancos y tabuladores, y luego añade la primera columna, e imprime la suma y el promedio:awk -f sum3.awk chapter2BEGIN {FS = ",|[ \t]+"} {print $1, $2} {s += $1} END {print "sum is",s,"average is", s/NR }