Comando AWK

download Comando AWK

If you can't read please download the document

Transcript of Comando AWK

AWKIntroduccinEl nombre awk proviene de las iniciales de sus desarrolladores : Alfred V. Aho, Peter J. Weinberger y Brian W. Kerningan, de los Laboratorios Bell de AT&T. Inicialmente se desarroll para escribir programas muy cortos, pero las caractersticas de este atrajo a los usuarios de tal modo, que lo impuls ms all de la idea original de los autores. En 1985 apareci una nueva versin llamada nawk, en la que se implementan caractersticas nuevas como son:Funciones de usuario.Expresiones regulares dinmicas con sustitucin de texto.Mayor nmero de funciones intrnsecas y variables.Nuevos operadores y estamentos.Entrada de mltiples archivos.Acceso a argumentos en la lnea de comandos.Mejora de los mensajes de error.awk es un lenguaje de bsqueda y procesamiento de patrones. Esto quiere decir que awk es capaz de buscar un patrn dentro de un archivo (al igual que grep) y tratarlo segn unas operaciones determinadas. Con awk se pueden desarrollar autnticos programas.Segn esto awk es capaz de procesar un archivo con datos organizados por columnas y generar nuevas columnas con los valores resultantes de realizar ciertos clculos u operaciones.A diferencia de comandos Unix como grep y sed, que filtran y procesan texto, awk incorpora su propio lenguaje de programacin, siendo capaz de ofrecer operaciones aritmticas, relaciones lgicas y variables. Se pueden desarrollar programas con awk que procesen la entrada estndar o un archivo, realizando tareas como tratar archivos de texto como bases de datos. El lenguaje de programacin awk incluye estamentos como for, while e if-else, as como un conjunto de funciones y variables incorporadas.Sintaxis:awk [-f archivo_programa] [-Fc] ['programa'] [variable=valor ...] [archivo]donde:archivo_programa : especifica el archivo fuente del programa a aplicar a archivo.c : especifica el carcter delimitador de campos. Por defecto se considera el espacio en blanco.programa : especifica el conjunto de patrones e instrucciones a ejecutar con archivo. La diferencia con archivo_programa, es que en este caso hay que especificar los patrones e instrucciones en la lnea de comandos. Para evitar interferencias con la shell deben ir encerradas entre comillas simples (').variable=valor : se utiliza para establecer los valores que tomarn las variables que utilice el programa.archivo : archivo que ser procesado por awk. Si se especifica "-" se interpretar como la entrada estndar.Campos y VariablesUna lnea de entrada se divide en campos separados por espacios, y cada campo se denomina como $1, $2, etc. $0 indica la lnea entera. Estas variables se pueden manipular (sumar, cambiar, etc.) como cualquier otra varible, por ejemplo:awk '{ $1 = $2 + $3; print $0 }' archivoSumar los campos 2 y 3 en el campo 1, e imprimir el nuevo registro (la lnea completa).Se pueden referir a los campos con expresiones numricas como $i, $(n+1), $(NF*3/NR), etc. Si la expresin resultante no es un entera, se truncar la parte decimal. El tratamiento de un campo como texto o numrico depender del contexto, awk resuelve las posibles ambigedades tratando los campos como texto (por ejemplo cuando se compara un texto con un nmero), por ejemplo:x=10 Asigna a x el valor numrico 10x="Hola" Asigna a x la cadena Holax="2"+"2" Asigna a x el valor 4, como si se hubiera escrito x=2+2, debido a que el contexto demanda un valor numrico.En los programas de awk no es necesario declarar las variables (indicar el tipo de variable de que se trata), se realizar automticamente en funcin del contexto. Por defecto se inicializan a la cadena nula o valor numrico 0, por lo que no es necesario inicializarlas, aunque es recomendable para facilitar la legibilidad del programa declararlas e inicializarlas.Existen unas variables predefinidas, que pueden ser utiles dentro del programa (no llevan el $ delante) y son:FS : Separador del campo de entrada. Se puede especificar con la opcin -Fc en la lnea de comandosRS : Separador de registro de entradaOFS : Separador del campo de salida.ORS : Separador de registro de salidaNF : Nmero de campos en el registro actualNR : Nmero de registros procesados hasta el momento. Al final del programa se podr conocer el nmero e registros tratados.RSTART : Posicin de la cadena en la que se verifica el patrn utilizado, comenzando desde 1. Es equivalente al valor retornado por la funcin match.RLENGTH : Longitud de la cadena en la que se verifica el patrn utilizado.SUBSEP : Separador de cadenas en arrays multidimensionales. El valor por defecto es " 34".Los valores de las variables relativas a separadores se pueden modificar en cualquier momento, asignndole el valor de cualquier carcter. Por defecto, los separadores de campos son espacios, y los de registros el carcter nueva lnea.Formato de los estamentosLa estructura general de los estamentos o conjuntos patrn-accin es:Patrn { accin }Interpretacin:Para cada lnea que verifique lo especificado en el patrn, se ejecutar la accin indicada.La accin siempre va encerrada entre llaves.Se pueden especificar varias acciones, separndolas por ";" o por el carcter nueva lnea.Si no se especifica la accin, se mostrarn por pantalla aquellas lneas que contengan el patrn. La accin est formada por estamentos (if, for, print, sprintf, next), los cuales deben finalizar en ";", Nueva Lnea o llaves. Dentro de las acciones se pueden realizar operaciones matemticas, de concatenacin, etc. Las variables utilizadas pueden ser escalares, campos o tablas, y son inicializadas a la cadena nula.Los patrones deben ir rodeados por caracteres "/", y puede contener dos patrones separados por una coma, en cuyo caso la accin se realizar para aquellas lneas comprendidas entre la primera aparicin del primer patrn y la siguiente aparicin del segundo patrn. Si se utiliza el smbolo "~", indicar que el patrn de la derecha est contenido en el campo de la izquierda, y si se utiliza "!~", indicar que no est contenido.Existen dos etiquetas opcionales, con un significado especial, que hacen que un programa awk tenga una estructura como la siguiente:BEGIN { accin }Patrn { accin }END { accin }La accin indicada en la etiqueta BEGIN se ejecutar antes de leer cualquier entrada, mientras que la accin asociada a la etiqueta END se ejecutar una vez tratadas todas las entradas. La etiqueta END se puede utilizar para imprimir resultados totales, o clculos realizados con todos los registros ledos.Cuando el conjunto patrn-accin se introduce desde la lnea de comandos, es necesario que vaya encerrado entre comillas simples, para protegerlo de la shell. Por ejemplo:Desde un archivo Desde la shell de Unixlength > 60 awk 'length > 60'A continuacin se muestran los diferentes tipos de acciones y estamentos.if (expresin) estamento [else estamento] while (expresin) estamento for (inicializacin ; final ; incremento) estamento for (var in array) estamento do estamento while (expresin) break continue { [estamento] } expresin por ejemplo una asignacion var=valorprint [lista de expresiones] [ > expresin] printf formato[, lista de expresiones] [ > expresin] return [expresin] next salta los elementos restantes de la lnea de entradadelete array [expresin] Borra un elemento arrayexit [expresin] Finaliza la ejecucin del programa, devolviendo el valor indicado en expresin.OperacionesUn programa awk puede hacer operaciones en coma flotante, utilizando los siguientes operadores:+, -, *, / Adicin, sustracin, multiplicacin y divisin% Operador mdulo o resto.++, -- Operador de incremente y decremento+=, -=, *=, /=, %= Asinacin al estilo C (x += 1 equivale a x = x + 1)Funciones IncorporadasLas siguientes funciones se pueden utilizar para la realizacin de operaciones aritmticas y con cadenas de caracteres.Funcin Descripcinlength(x) Devuelve la longitud del argumentosqrt(x) Devuelve la raz cuadrada del argumentolog(x) Devuelve el logaritmo en neperiano del argumento (en base e)exp(x) Devuelve el valor de e elevado al argumentoint(x) Devuelve la parte entera del argumentocos(x) Devuelve el coseno del argumentosin(x) Devuelve el seno del argumentoatan(x) Devuelve el arcotangente del argumentorand() Devuelve un nmero aleatorio comprendido entre 0 y 1match(s,r) Devuelve la posicin de s en donde ocurre r, comenzando desde 1. Si no existe devuelve 0.substr(s,m,n) Devuelve la subcadena de s que comienza en la posicin m y finaliza en la n.sub(r,t,s) Sustituye la primera ocurrencia de t por r en la cadena s. Si no se especifica s se tomar todo el registro ($0).gsub(r,t,s) Igual que sub, pero sustituyendo todas las ocurrencias.split(s,array,sep) Divide la cadena s en array[1],...,array[n]. Se devuelve el nmero de elementos. Si no se especifica el separador en sep se utilizar el valor de FS. s puede ser una variable.index(s1,s2) Devuelve la posicin de la cadena s1 en donde se encuentra la cadena s2. En caso de no encontrarse se devuelve 0.sprintf(f,e1,e2,...) Devuelve la cadena resultante de imprimir los valores e1, e2, ... con el formato especificado en f.toupper(s) Devuelve la cadena s convertida a maysculas.tolower(s) Devuelve la cadena s convertida a minsculas.system(cmd) Ejecuta el comando UNIX cmd especificado y retorna el estado de salida de este.print e1, e2, ... Presenta en la salida los valores e1, e2, ...printf f, e1, e2, ... Presenta en la salida los valores e1, e2, ... con el formato especificado por f (al estilo C: %s, %d, etc.).close(f) Cierra el archivo o pipe abierto con print, printf o getline.getline X Lee el siguiente registro de la entrada y se lo asigna a X, si no se especifica X se asignar a $0.La concatenacin de cadenas no tiene ningua funcin ni operacin especial, simplemente se realiza escribiendo expresiones tras otras:Persona = Apellidos ", " NombreFuncionesLas funciones se pueden definir (en la posicin de un estamentopatrn-accin) del siguiente modo:function Nombre_Funcin(p1, p2, p3){ ...return x}Los parmetros se pasan por valor si son escalares y por referencia si se pasa el nombre del array. Los parmetros son locales, mientras que el resto de las variables son globales. Las funciones pueden llamarse de forma recursiva.EjemplosEjemplos de patrones/prueba/ Todas las lneas que contengan la cadena "prueba".$2 ~ /prueba/ Todas las lneas cuyo segundo campo contenga la cadena "prueba".$1 !~ /prueba/ Todas las lneas cuyo primer campo no contenga la cadena "prueba"./start/ , /stop/ Todas las lneas existentes entre los patrones "start" y "stop".Ejemplos de acciones{ print $5 } Imprime el campo 5.{ print $1 $3 } Imprime los campos 1 y 3 consecutivamente.{ s=$2+$3 ; print s } Suma los campos 2 y 3 e imprime el resultado.{tot=$2+$3; print $0, tot} Suma de los campos 2 y 3, e imprime la lnea original y la suma.BEGIN {FS = ",[ \t]*|[ \t]+" }{ s += $1; print $2, $1 }END { print "La suma es ", s , "La media es ", s/NR Toma como separador de entrada la coma y/o los blancos y tabulaciones.Suma el primer campo de todos los registros e imprime los campos 2 y 1 (en ese orden).Al final imprime el total y la media.Ejemplosls -l | awk '/txt/ { print &8 }' - Muestra los archivos que contengan como propietario, nombre, grupo, etc. la cadena txt. El smbolo "-" indica que el archivo es la entrada estndar. awk '/cadena/ { cont=cont+$2 ; print $2 "\t" cont }' cont=0 archivo Busca cadena en archivo y en una variable llamada cont (contador) va sumando los valores del campo 2 e imprimiendo dicho campo, un tabulador y el valor del contador. Al final de la salida tendremos la suma total de los valores que ha tenido cadena en el campo 2.awk '$2>0 { print $1," ", $2 }' archivo Para cada lnea de archivo, si el 2 campo es positivo, imprime los dos primeros campos.awk '$2>0 { printf "%s %d\n", $1, $2 }' archivo Idem que el caso anterior, suponiendo que el primer campo es una cadena de caracteres.awk '{gsub(" ","",$0); print $0;}' archivo Elimina todos los espacios en blanco del archivo especificado y lo muestra en pantalla.awk '{if (NF>0) print $0}' archivo Elimina todas las lneas vacas de archivoawk '{} END {print NR}' archivo Muestra el nmero de registros (lneas) que contiene archivoEl siguiente ejemplo suma las columnas 2, 3 y 4 de un archivo, presentando el resultado al final.cat archivo | awk 'BEGIN { campo1=0; campo2=0; campo3=0; }{campo1+=$2;campo2+=$3;campo3+=$4;}END { printf "campo1 = %d\t campo2 = %d\t campo3 = %d\n", campo1, campo2, campo3; }'En el siguiente ejemplo se hace lo mismo que en el anterior pero para las lineas que contengan la palabra TOTAL en el primer campo.cat archivo | awk 'BEGIN { campo1=0; campo2=0; campo3=0; } $1 ~ /TOTAL/ {campo1+=$2;campo2+=$3;campo3+=$4;}END { printf "campo1 = %d\t campo2 = %d\t campo3 = %d\n", campo1, campo2, campo3; }'