La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

4 – Filtros Programación II Ing. Diego J. Arcusin info@digikol.com.ar.

Presentaciones similares


Presentación del tema: "4 – Filtros Programación II Ing. Diego J. Arcusin info@digikol.com.ar."— Transcripción de la presentación:

1 4 – Filtros Programación II Ing. Diego J. Arcusin

2 Introducción a los Filtros
Programas de UNIX que leen una entrada, realizan una transformación y escriben una salida. Ejemplos: grep y tail Seleccionan parte de una entrada sort Clasifica la entrada wc Cuenta la entrada. etc. Filtros de Datos o Filtros Programables sed Editor de Flujo awk Filtro programable con sintaxis similar al C

3 Grep $ grep patrón archivos....
El comando grep examina los archivos nombrados (o la entrada estándar) e imprime cada línea que contenga un caso de patrón. Ejemplos: grep –n variable *.[ch] Localiza “variable” en archivos fuentes de C grep –y mary $HOME/lib/agenda Encontrar el número de teléfono de Mary who | grep mary Comprobar si mary inicio sesión ls | grep –v .c Archivos que no sean fuentes de C -n Imprime lo números de línea - v Invierte el sentido de la prueba -y Hace indistinto el patrón en mayúsculas o minúsculas Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

4 Expresiones Regulares
Grep (y todos los filtros) manejan patrones mucho más intricados denominados Expresiones Regulares. Las expresiones regulares se especifican dando un significado especial a ciertos caracteres. Algunos metacaracteres: ^ Ancla el patrón al inicio de la línea $ Ancla el patrón al final de la línea. [a-z] Rango (cualquier minúscula) Ojo!!: [^0-9] Complemento del Rango (cualquier caracter menos un dígito) . Se acopla con cualquier caracter (Similar al ? para el Shell) Algunos ejemplos: $ ls –l | grep ‘^d’ Lista los nombres de directorios $ ls –l | grep ‘^ rw’ Lista los archivos que otros pueden leer y escribir. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

5 Expresiones Regulares (cont.)
Operador cerradura ‘*’ Se aplica al caracter o metacaracter anterior (incluyendo un rango), y en conjunto concuerdan con cualquier número de acomplamientos sucesivos del caracter o metacaracter. Ejemplos: x* Concuerda con una secuencia de x lo más larga posible. [a-zA-Z]* Concuerda con una cadena alfabética de cualquier longitud .* Concuerda con cualquier cosa hasta una nueva línea .*x Concuerda con cualquier cosa hasta la última x del renglón Advertencias: * Se aplica exclusivamente a un caracter. fg* reconoce a una f seguida de varias g, y no una secuencia como fgfgfgfg. * Reconoce cero, una o varias concordancias del caracter. Si queremos que reconozca por lo menos un caracter tendremos que duplicarlo. Por ejemplo para reconocer una cadena de letras la expresión correcta será [a-zA-Z][a-zA-Z]* Ninguna expresión regular de grep reconoce el caracter nueva línea. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

6 La Familia Grep grep es en realidad el más antiguo de su familia.
fgrep Permite buscas muchas cadenas literales simultáneamente egrep Busca expresiones regulares verdaderas (Igual que grep pero adiciona el operador “o” y paréntesis para agrupar expresiones. Los paréntesis se utilizan para agrupar de manera que: (xy)* concuerda con la cadena vacía, xy, xyxy,xyxyxy, y así sucesivamente. La barra vertical | es un operador “o”. Egrep agrega otros dos operadores de cerradura: + y ?. x+ reconoce una o más x x? reconoce cero o una x (no varias) Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

7 Ejemplos Complejos ^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$ Encuentra palabras que contengan las 5 vocales en orden alfabético. egrep ‘^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$’ archivo | grep ‘ ’ Encuentra palabras de 6 letras que tengan todas sus letras (distintas) en orden alfabético. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

8 ¿Por qué 3 programas? fgrep no interpreta ningún metacaracter, pero permite la búsqueda eficiente de miles de palabras en paralelo. El tamaño de los patrones típicos de fgrep rebasa la capacidad de los algoritmos usados en grep y egrep. La distinción entre grep y egrep es más difícil de justificar. Simplemente grep es más antiguo (aunque más difundido). Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

9 Sort Por default, clasifica su entrada por renglones en orden ASCII. Algunas de sus opciones: -f Vuelve equivalentes mayúsculas y minúsculas. -d Orden de diccionario. Ignora todos los caracteres excepto letras, dígitos y blancos. -n Comparación numérica -r Revierte el sentido de la comparación -o Especifica un nombre de archivo para la salida -u Suprime las líneas repetidas Ejemplos: ls | sort –f Clasifica los archivos por orden alfabético ls –s | sort –n Clasifica los archivos más pequeños primero ls –s | sort –nr Clasifica los archivos más grandes primero Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

10 Sort (Campos) Se le puede indicar a sort que dirija solo su atención a campos específicos. La notación +m significa que la comparación omite los primeros m campos; +0 es el inicio de la línea. Así por ejemplo: ls –l | sort +3nr Clasifica por conteo de bytes (primero el más grande) who | sort +4n Clasifica por tiempo desde inicio de sesión (primero el más antiguo) Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

11 Más filtros El comando tr translitera los caracteres de su entrada. Uno de los usos más comunes es la conversión de mayúsculas y minúsculas. $ tr a-z A-Z Convierte minúsculas en mayúsculas $ tr A-Z a-z Convierte mayúsculas en minúsculas Uniq Elimina renglones duplicados dd Bastante distinto a lo visto hasta ahora. Suele emplearse para manejar datos en bruto y sin formato. Posee recursos para transformar de ASCII a EBCDIC y para manejar datos binarios. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

12 Sed Lee un renglón a la vez a partir de los archivos de entrada, aplica los comandos de la lista, por orden a cada renglón y escribe su forma editada en la salida estándar. Sintaxis: sed ‘lista de comandos’ archivo ... Por ejemplo: sed ‘s/UNIX/UNIX (TM)/g’ archivos ... > output Advertencia: sed no altera los contenidos de sus archivos de entrada. Escribe sobre la salida estándar por lo que archivos originales permanecen intactos. Otro ejemplo: who | sed ‘s/ .* / /’’ Trae solo los nombres de usuarios y la hora de inicio de sesión. sed ‘s/^/->/’ o sed ‘/./s/^/->/’ $* Pone un tabulador al inicio de cada línea. La segunda versión solo lo hace en aquellos renglones que no sean sólo un caracter nueva línea. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

13 Sed (Cont.) Por defecto realiza la impresión automática de la salida. La opción –n desactiva la salida la cuál debe ser explicitada mediante el comando p. Por ejemplo: $ sed –n ‘/patrón/p’ hace lo mismo que grep $ sed –n ‘/patrón/!p’ hace lo mismo que grep –v Otros ejemplos: $ sed ‘s/$/\ Agrega un caracter nueva línea al final de cada renglon > /’ haciendo que la salida tenga doble espacio. $ sed ‘s/[ ->][ ->]*/\ Reemplaza cada cadena de blancos o tabs por un nueva línea > /’ por lo que divide cada palabra de la entrada en un renglón. $ sed –n ’20,30p’ Imprime sólo las líneas 20 a 30. $ sed ‘1,10d’ Borras las líneas 1 a 10 (= a tail +11) $ sed ‘1,/^$/d’ Borra hasta la primera línea en blanco inclusive $ sed ‘$d’ Borra la última línea Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

14 awk Awk es parecido al sed pero con una sintaxis más similar al lenguaje C. Sintaxis: $ awk ‘programa’ archivos... La sintaxis del programa es: patrón { acción} patrón { acción} Awk lee la entrada en los nombres de archivo un renglón a la vez. Cada renglón se compara con cada patrón en orden, para cada patrón que concuerde con el renglón se efectúa la acción correspondiente. Al igual que sed, awk no altera los archivos de entrada. Los patrones pueden ser expresiones regulares exactamente como en egrep, aunque también pueden ser condiciones más complejas que recuerdan más al lenguaje C. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

15 awk (cont.) Ejemplos: El patrón y la acción son opcionales.
awk ‘/expresion regular/ { print }’ archivos Hace lo que egrep El patrón y la acción son opcionales. Si se omite la acción, la acción por default es imprimir la línea. Si se omite el patrón, la parte de acción se hace para todas la líneas de la entrada. Al igual que en sed los comandos de awk pueden estar en un archivos separado mediante la siguiente sintaxis: $ awk –f cmdfile archivo ... Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

16 awk - Campos Awk divide cada renglón de entrada automáticamente en campos (cadenas de caracteres que no sean blancos, separados por blancos o tabuladores.) Por ejemplo la salida de who tiene 5 campos: $ who carlos tty2 Sep 14 11:53 maria tty3 Sep 14 11:27 Awk llama a los campos $1, $2,..., $NF. NF es una variable cuyo valor es igual al número de campos. En este caso NF = 5 en ambos renglones. Notese la diferencia entre NF –número de campos- y $NF –el último campo del renglón-. En awk, a diferencia del Shell, sólo los campos empiezan con $, las variables no tienen ‘adornos’. Por ejemplo: $ du –a | awk ‘{ print $2 }’ Excluye los tamaños deja sólo los nombres de archivos. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

17 awk – Campos (cont.) Awk normalmente supone que el espacio en blanco (cualquier número de blancos y tabuladores) separa los campos, pero el separador puede cambiarse a cualquier caracter. Una manera de hacerlo es recurrir a la opción –F (mayúscula) de la línea de comandos. Por ejemplo: $ awk –F: ‘{ print $1 }’ /etc/passwd Imprime sólo los nombres de usuarios del /etc/passwd Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

18 awk – Impresión La variable NR es el número del “registro” o línea actual. $ awk ‘{ print NR $0 }’ Imprime el número de línea seguido de la línea completa. El campo $0 es la línea entera, sin cambios. En una acción print, los elementos separados por comas se imprimen separados por el separador de salida (Por default el blanco.) La proposición printf permite un control completo sobre la salida. (similar al C) $ awk ‘{ printf “%4d %s\n”, NR, $0}’ %4d especifica un entero decimal (NR) en un campo de 4 dígitos de ancho, %s especifica una cadena de caracteres ($0) y \n un caracter nueva línea. (Printf no imprime ni blancos, ni nuevas líneas por default). Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

19 awk – Patrones $ awk –F: ‘ $2 == “” ’ /etc/passwd Busca los usuarios sin contraseña. Otras formas de obtener el mismo resultado: $2 ~ /^$/ El segundo campo concuerda con la cadena vacía. $2 !~ /./ El segundo campo no concuerda con cualquier caracter. length($2) = = 0 La longitud del segundo campo es cero. El símbolo ~ indica concordancia con una expresión regular y !~ significa “no corresponde”. La expresión regular debe estar encerrada entre diagonales. Awk se vale de la misma convención que el Shell para los comentarios. El símbolo # indica el inicio de un comentario. La función substr(s,m,n) produce la subcadena se s que comienza en la posición m y mide n caracteres de largo. El Awk proporciona dos Patrones especiales BEGIN y END. Las acciones de BEGIN se realizan antes del primer renglón, y las acciones de END se efectúan luego de ser procesado el último renglón. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

20 awk – Ejemplos $ awk ‘NF % 2 != 0{ print}’ Despliega si hay un número par de campos $ awk ‘length($0) > 72 { print “Renglón”, NR, “muy largo:”, substr ($0,1,50)}’ $ date Thu Aug 29 12:17:01 EDT 2005 $ date | awk ‘{ print substr($4, 1, 5)}’ 12:17 $ awk ‘BEGIN {FS = “:”} Nuevamente Busca usuarios sin contraseña > $2 == “” ‘ /etc/passwd awk ‘END { print NR }’ ... Idem wc –l Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

21 awk – Operaciones Aritméticas
awk también puede realizar cálculos sobre los datos de entrada. Es muy sencillo contar cosas, hacer sumas, sacar promedios y otras operaciones afines. Por ejemplo, para sumar todos los números de la primera columna: { s = s + $1 } END { print s } Si modificamos la última línea del programa por END { print s, s/NR } Imprime la suma y el promedio. La variables se inicializan a cero por default. Awk ofrece además los mismos operadores aritméticos abreviados que el lenguaje C. Por ejemplo: s += $1 es lo mismo que s = s + $1 Ejemplo: # Versión de wc hecha en awk. { nc += length ($0) + 1 # número de caracteres nw += NF } END { print NR, nw, nc} Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

22 awk – Variables Las variables también pueden guardar cadenas de caracteres. Las variables de cadena se inicializan con la cadena vacía. Variables predefinidas en awk FILENAME Nombre del archivo de entrada actual FS Caracter separador de campo (blanco y tab por default) NF Número de campos del registro de entrada NR Número del registro de entrada OFMT Formato de salida para números (%g por default) OFS Cadena separadora de campo de salida (blanco por default) ORS Cadena separadora de registro de salida (Nueva línea por default) RS Caracter separador de registro de entrada (Nueva línea por default) Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

23 awk – Operadores Operadores de awk (por orden creciente de precedencia) = += -= *= /= %= Asignación || O lógico && Y lógico ! Niega el valor de la expresión > >= < <= = = != ~ !~ Operadores relacionales ~ y !~ equivalen a correspondencia y no correspondencia nada Concatenación de cadenas más, menos * / % multiplicar, dividir, resto Incrementar, decrementar (prefijo o postfijo) Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

24 awk – Control de Flujo IF (Exactamente igual a la instrucción del lenguaje C). Sintaxis: if (condición) proposición 1 else proposición 2 FOR (Exactamente igual a la del lenguaje C). Sintaxis: for (expresión 1; condición ; expresión 2) proposición WHILE (equivalente al for anterior) expresión 1 while (condición ) { proposición expresión 2 } La proposición next hace que se lea la siguiente línea de entrada y que se comparen los patrones para reanudar la ejecución al inicio del programa. La proposición exit origina una transferencia inmediata al patrón END. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

25 Otro ejemplo El siguiente programa detecta palabras duplicadas sucesivas. awk ‘ FILENAME != prevfile { # Nuevo archivo NR = 1 # Restablecer número de renglón prevfile = FILENAME } NF > 0 { if ($1 == ultimapalabra) printf “ duplicación %s, archivo %s, línea %d\n”, $1, FILENAME, NR for ( i=2; i <= NF; i++ ) if ( $i == $(i-1) ) printf “ duplicación %s, archivo %s, línea %d\n”, $i, FILENAME, NR ultimapalabra = $NF }’ $* $ Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

26 Otro ejemplo El siguiente programa invierte el contenido de todos los renglones awk ‘ { for ( i = NF; i >= 2; i - - ) printf “%s “, $i printf “\n“ }’ $* $ Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

27 Arreglos Awk también proporciona arreglos. Ejemplo trivial: Invierte los renglones. $ cat backwards # backwards: despliega la entrada en dirección contraria awk ‘ { linea[NR] = $0 } END { for ( i = NR; i > 0; i - -) print linea[ i ] } ‘ $* $ Los arreglos no necesitan ser declarados. El tamaño del arreglo está limitado únicamente por la memoria disponible. Awk soporta arreglos asociativos. Por lo general concebimos subíndices de arreglos como enteros, pero en awk cualquier valor puede servir de subíndice. Por ejemplo, para sumarizar por nombre 2 columnas del tipo: Carlos Martin Carlos Sandra { sum [ $1 ] += $2 } END { for (name in sum) print name, sum [name] ) Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

28 Otro ejemplo $ cat frecuencia # frecuencia: muestra todas las palabras utilizadas y su frecuencia awk ‘ { for ( i = 1; i <= NF ; i++ ) num[$i]++ } END { for ( palabra in num) print palabra, num[palabra] } ‘ $* | sort +1 -nr $ Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

29 Funciones predefinidas de awk
cos (expr) Coseno de expr exp (expr) Exponencia de expr: e elevado a exp getline( ) lee la siguiente linea de entrada; devuelve 0 si es fin de archivo, 1 de lo contrario index (s1,s2) Posición de la cadena s2 en s1; devuelve 1 si no está. int (expr) Parte entera de expr, truncar hacia 0. length (s= longitud de la cadena s log (expr) Logaritmo natural de expr sin (expr) Seno de expr split (s,a,c) Divide s en a[1] ... a[n] en el carácter c; devuelve n sprintf (fmt, ...) Da formato a ... según la especificación de fmt substr (s,m,n) Subcadena de n caracteres de s, comenzando en la posición n Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

30 Interacción con el Shell
Supongamos que el usuario quiere escribir un programa campo n que imprime el campo n-esimo de cada renglón de la entrada. Por ejemplo: $ who | campo 1 Debería desplegar sólo el nombre de los usuarios que iniciaron sesión. Para poder resolver esto pasando un parámetro del shell al awk: awk ‘{ print $’$1’ }’ Otra forma de hacerlo (aunque es preferible la anterior): awk “{ printf \$$1 }” Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

31 Preguntas ?

32 Ejercicios 4.1. Crear un archivo diccionario.txt, con todas las palabras (una por línea) tomadas de archivos de datos (en castellano) de su Home Directory. El archivo diccionario.txt debe quedar ordenado, no contener duplicados y todas las letras deberán estar en minúsculas. a) Extraer todas las palabras que empiecen y terminen con vocal. b) Mostrar el archivo eliminando todas las vocales, estén acentuadas o no. c) Un diptongo está  formado por dos vocales, una fuerte y una débil, o dos débiles. Las vocales fuertes son a, e, o; las vocales débiles son i, u. La acentuación de u o i destruye el diptongo. i) mostrar todas las palabras con diptongo formado por dos vocales débiles, ii) mostrar todos los diptongos con a; iii) buscar una expresión regular mínima que despliegue todos los diptongos. d) Mostrar todas las palabras de 3 letras o más que sean palíndromos. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.

33 Ejercicios 4.2. El archivo acceso.log registra el acceso de los usuarios a un sistema UNIX. Este archivo cuenta con un renglón por cada uno de los accesos y posee la siguiente estructura de campos separados por “:” - Usuario - Fecha de Ingreso (Formato: ddmmyyyy) - Hora de Ingreso (Formato: hhmmss –24 horas-) - Dirección IP Desarrollar comandos que: a) Muestren el nombre de cada usuario y la cantidad total de accesos registrados, en orden alfabético. b) Extraer del archivo las líneas correspondientes a un usuario particular que se recibirá como parámetro. c) Agregar dos parámetros opcionales que permitan extraer sólo los registros correspondientes a cierto mes o cierto año. d) Extraer del archivo acceso.log las líneas que correspondan al usuario jperez o al usuario elopez. Se puede decir que las variantes de Bell (1era a 6ta= era una versión comercial continuada por AT&T, y la versión de Berkley era una versión academica. Linux toma partes de cada una de estas ramas.


Descargar ppt "4 – Filtros Programación II Ing. Diego J. Arcusin info@digikol.com.ar."

Presentaciones similares


Anuncios Google