Seminario sobre awk 1 AWK Procesa y manipula información en ficheros: * Busca la ocurencia de patrones de caracteres en ficheros. * Ejecuta una(s) acción(es) en las lı́neas en las que (no) se encuentra el patrón dado. * No altera el fichero de entrada * Trabaja con campos y registros p Campo ≈ Palabra p Registro ≈ Lı́nea Ambos conceptos modificables Félix Sánchez C.I.C.A. Seminario sobre awk 2 Formato . awk [-Fc][ -f fichero.com] [fichero.datos] . awk [-Fc] ‘/patrón/{acción}‘ [fichero.datos] Ejemplos awk -F% ‘/resultados/{print $4}’ salida.dat awk ‘{print $2}‘ salida.dat ls -ls | awk ‘{print $4 $5}‘ Félix Sánchez C.I.C.A. Seminario sobre awk 3 Caracteres especiales en el patrón Exp. Significado Ejemplo C Identifica el caracter C, siempre que C no sea caracter especial. /A/ Selecciona todas la lı́neas conteniendo una A mayúscula. \C Identifica el caracter C, incluso siendo C un caracter especial /\\/ Identifica lı́neas con \. \oct Cuando oct es un número octal de tres dı́gitos, identifica el caracter (byte) que tiene ese valor. /\011/ identifica el caracter tabular. Félix Sánchez C.I.C.A. Seminario sobre awk 4 ˆ Identifica el principio de una lı́nea, o cadena. /ˆpe/ Selecciona las cadenas persona, pena, pero no tope $ Identifica final de lı́nea o cadena. /pe$/ Ahora sólo cogerı́a tope [lst] Identifica cualquier caracter en en lst.Se pueden usar rangos de letras del tipo g-m, para indicar cualquier letra entre esas dos. /[a-zA-Z]/ Identifica cadenas que contengan algún caracter alfabético, mayúsculas, o no. [ˆls] Identifica cualquier caracter no incluido en la lista ls. /[ˆ0123456789]/ Da todas las lı́neas que no contengan números. Félix Sánchez C.I.C.A. Seminario sobre awk 5 | Contempla más de un solo caso /(a|b)c/ Selecciona ocurrencias de ac, bc y tt abc. . Identifica cualquier caracter simple. /x.y/ tomará las lı́neas que contengan xny, xcy etc. ? Identifica cero o más caracteres. /fi?e/ tomará lı́neas que tengan fie, filete, fiese Félix Sánchez C.I.C.A. Seminario sobre awk 6 Expresiones lógicas de búsqueda Expresión Significado patron1 || patron2 Válida si se verifica patrón1, patrón2, o ambos patrones. patron1 && patron2 Válida solo si se verifican ambos patrones. !patron Identifica todas las cadenas que no coincidan con el patrón. var ˜ patron Válida solo si el patrón encaja con el valor d e la variable var. Félix Sánchez C.I.C.A. Seminario sobre awk 7 Expresiones lógicas de búsqueda (cont.) var !˜ patron Válida solo si el patrón no encaja con el valor de la variable var. > < <= >= != == Se usan para verificar expresiones mayor-que, menor-que, menor-o-igual-que, mayoro-igual-que, distinto-de, o, igual-a, respectivamente. Félix Sánchez C.I.C.A. Seminario sobre awk 8 Variables predefinidas $0 Todo el registro de awk ’{print $0}’ fich_dat $1 El primer campo del registro de entrada. awk ’{print $1}’ fich_dat $n El nsimo campo del registro awk ’{print $5}’ fich_dat NR Número del registro actual, se empieza por 1. awk ’{print NR}’ fich_dat NF Número de campos en el registro actual, el primer campo es el 1. awk ’{print NF}’ fich_dat FS Separador de campos de la entrada. awk ’{FS=":"}{print $1}’ fich_dat Félix Sánchez entrada. de entrada. C.I.C.A. Seminario sobre awk 9 RS Separador de registros de la entrada. awk ’{RS=")" ; print $2}’ fich_dat OFS Separador de campos de la salida. awk ’{ OFS="." ; print $1,$2}’ fi ORS Separador de registros de la salida. awk ’{ORS=":" ; print $0}’ fich_d OFMT Formato de salida para números. Por defecto, es %.6g awk ’{OFMT="%.5g" ; print $2}’ f_d len La longitud del registro actual. awk ’{print length($0)}’ fich_dat Fnam El nombre del fichero de entrada. awk ’{print FILENAME}’ fich_dat Félix Sánchez C.I.C.A. Seminario sobre awk 10 Operadores Matemáticos Operador Significado ++ -- Incremento unidades. * / % Multiplica, divide, y resto. + - Suma y resta. > < Comparadores: mayor que, menor que. igual. <= >= menor o igual que, mayor o igual que. != == Distinto de, igual a. Félix Sánchez o decremento en C.I.C.A. Seminario sobre awk 11 Funciones Matemáticas Funciones Significado cos(expr) Coseno de expr. exp(expr) Función exponencial (e elevado a la potencia expr). int(expr) Parte entera de . log(expr) Función logarı́tmica de. sin(expr) Seno de. sqrt(expr) Raiz cuadrada de. Ejemplos: sin($5) awk ’{pepe=sin($5)}{print pepe}’ sqrt($5/NR) awk ’{pp=sqrt($5/NR)}{print pp}’ Félix Sánchez C.I.C.A. Seminario sobre awk 12 Reglas para crear ficheros de comandos awk * Sintaxis libre como en lenguaje C. * Varias acciones en la misma lı́nea se separan con ”;”. * Una acción escrita en más de una lı́nea, se continúa con \. * Admite lı́neas de comentarios con el caracter #. * Las cadenas de caracteres se usan encerradas por ”. * Se puede alterar el concepto de campo y registro. Félix Sánchez C.I.C.A. Seminario sobre awk 13 Reglas(cont.) * Funciones definidas por el usuario, para uso posterior reiterado: function max(m,n){return m > n ? m : n} PEPE=max(VAR,$6) * Llamadas a comandos del sistema operativo mediante la función interna system system("who") * Estructuras de control de flujo: if, while. . . Félix Sánchez C.I.C.A. Seminario sobre awk 14 Reglas(cont.) * Patrones especiales BEGIN y END que nos permiten ejecutar algunas acciones previas (o posteriores) al procesado del fichero. * Patrones formados por expresiones $3 < 100. * Patrones de identidad /Asia/. * Patrones compuestos $3 < 100 && $4 == "Asia". * Patrones formados por un rango de lı́neas: NR == 10, NR == 20 Félix Sánchez C.I.C.A. Seminario sobre awk 15 Algunas operaciones con cadenas Operad. o Func. Significado cad1 cad2 Concatenación de cad1 con cad2. getline Lee el próximo registro, devuelve 0 si encuentra fin de fichero, 1 si no. index(cad1,ca2) Devuelve el ı́ndice de la cadena cad1 dentro de ca2, devuelve cero en caso de que ca2 no esté contenida en cad1. length(cad) Devuelve el número de caracteres de cad. print[arg] Copia las cadenas pasadas como arg a la salida estandar, copia todo el registro si arg no aparece. Félix Sánchez C.I.C.A. Seminario sobre awk 16 Operaciones con cadenas(cont.) printf "fmt", arg Copia las cadenas arg con formato dado como fmt (equivale a la función de C printf). split(cad,arr,c) Divide la cadena cad en arr[1], arr[2],...,arr[n], para cada ocurrencia del caracter c. sprints(fmt,args) Formatea las cadenas args con el formato fmt y devuelve el resultado. substr(str,ind,l) Devuelve la sub-cadena de str que empiece en el caracter número ind, con logitud l. Félix Sánchez C.I.C.A. Seminario sobre awk 17 Estructuras de control de flujo for(expr1;condición;expr2) { accion(es) } Ejecuta la expresión expr1 una vez. Hasta que la condición sea falsa sigue ejecutando la expresión expr2 y la accion(es). { for( i=1; 1 <= NF; i++) print $1 } for(i in array) { accion(es) } Ejecuta la accion(es) mientras i esté contenido en el array { for(i in conjunto) {print i, conjunto[i]} } Félix Sánchez C.I.C.A. Seminario sobre awk 18 if(expr) {accion(es)} if evalua la expresión expr, y si no es falsa, ejecuta las acciones accion(es) { if (TOPE < $3) {TOPE = $3 ; dato = $1 }} else{ accion(es) } { if ($1 <= Es continuación de if, si es falsa la condición de aquél ejecuta accion(es) $3) {valor = valor * $1; else {valor = 1 ; print $1}} while (expr) { accion(es)} Ejecuta la accion(es) mientrasla expresión expr sea verdad. { i = 1 ; while (i <= NF){ print $1 ; ++i} } Félix Sánchez C.I.C.A. Seminario sobre awk 19 Ejemplos # cadena "x" contiene una lista de vocales. BEGIN { x = "a e i o u" split(x, vocal) } # Ahora, "vocal" contiene el contador de vocales { for ( i=1 ; i <= length($0) ; i ++ ) if ( $i == "a") vocal["a"]++ if ( $i == "e") vocal["e"]++ if ( $i == "i") vocal["i"]++ if ( $i == "o") vocal["o"]++ if ( $i == "u") vocal["u"]++ } { punto[NR] = index( $0 , "." ) } {print vocal["a"], vocal["e"], vocal["i"], vocal["o"], vocal["u"], punto[NR]} Félix Sánchez C.I.C.A. Seminario sobre awk 20 Ejemplos(cont.) Procedimiento de comandos del shell que usa varios awk para filtrar la salida de comandos: w | sed -e ’1d’| awk ’{printf \ "%12s %6s\n",$1,$4}’ > TEMP1 awk ’{FS = ":"; if ( $2 != "") \ {print $1}}’ TEMP1 > TEMP2 awk ’{ORS = "|" ; print $1}’ TEMP2 > TEMP3 echo "ps -axu|egrep ’.("‘cat TEMP3‘")’" \ > TEMP4 sed -e ’s/|)/)/’ TEMP4 > TEMP5 csh TEMP5|awk ’{printf \ "%10s %8s %4s %30s\n", \ $1,$2,$8,$10 $11 $12}’ Félix Sánchez C.I.C.A.