require(".zlconfig.php"); require("$webroot/cabecera.php"); ?> $navIdx->Asignar("texto_indice.php","Índice"); $navIzq->Asignar("texto_cap4.php","Capítulo 4"); $navDer->Asignar("texto_cap6.php","Capítulo 6") ?>
$graf_titulo = "$base_grafs/docs_head.png"; ?> require("$webroot/titulos.php"); ?>5. Localización de patrones: La familia grep.
La familia grep forma un conjunto de tres utilidades para la búsqueda en ficheros de patrones regulares de caracteres.
grep [opciones] [patron] [file] [> file.out]
Hay tres programas en la familia. grep es el primero que apareció y localiza patrones regulares con alguna particularidad. fgrep realiza una búsqueda muy rápida pero los patrones están delimitados. egrep es una forma extendida de grep que busca patrones regulares de forma completa aunque ello conlleva lentitud de proceso.
5.1 grep (Global Regular Expresion Printer)
Tiene las siguientes opciones:
-b | Antepone a cada línea en que se encuentra el patrón el número de bloque en el que está. Cada bloque tiene 512 caracteres y el primero es el 0. | |
-c | Visualiza sólo el número de líneas en las que coincide el patrón. | |
-i | No hace distinción entre mayúsculas y minúsculas al realizar comparaciones. | |
-l | Visualiza sólo los nombres de fichero en las que coincide. | |
-n | Visualiza el número de línea antes de cada línea. | |
-s | Suprime la visualización de los mensajes de error. | |
-v | Visualiza sólo aquellas líneas en las que no coinciden con el patrón. | |
-w | Busca el patrón como palabra. |
Los patrones utilizan expresiones regulares limitadas adaptadas de ed. Podemos agruparlas de la siguiente forma (ver el apartado sobre expresiones regulares y el que trata el programa sed)
. | Coincide con cualquier carácter. | |
\ | Desactiva el significado especial de un carácter. | |
[lista] | Coincide con cualquier carácter de los que está en la lista (valen rangos). | |
[^lista] | Coincide con cualquier carácter que no está en la lista. | |
* | Coincide con cero o más ocurrencias del carácter anterior. | |
^ | Coincide con el principio de línea. | |
$ | Coincide con el final de línea. | |
c\{m\} | Coincide con m (entre 0 y 255) ocurrencias del carácter c. |
Este programa realiza realiza búsqueda de patrones simples en ficheros de forma más rápida y eficiente. Sólo tiene las siguientes opciones
-b | Antepone a cada línea en que se encuentra el patrón el número de bloque en disco. Cada bloque tiene 512 caracteres y el primero es el 0. | |
-e patron | Puede buscar patrones que empiecen con un guión. | |
-c | Visualiza sólo el número de líneas en las que coincide el patrón. | |
-f file | Toma el patrón de fichero y no de la línea de comandos. | |
-i | No hace distinción entre mayúsculas y minúsculas al realizar comparaciones. | |
-l | Visualiza sólo los nombres de fichero en las que coincide. | |
-v | Visualiza sólo aquellas líneas en las que no coinciden con el patrón. | |
-x | Sólo compara líneas completas. |
Se trata de una versión completa de grep que acepta como patrón expresiones regulares complejas. Tiene las siguientes opciones
-b | Antepone a cada línea en que se encuentra el patrón el número de bloque en el que está. Cada bloque tiene 512 caracteres y el primero es el 0. | |
-c | Visualiza sólo el número de líneas en las que coincide el patrón. | |
-e patron | Puede buscar patrones que empiecen con un guión. | |
-f file | Toma el patrón del fichero y no de la línea de comandos. | |
-i | No hace distinción entre mayúsculas y minúsculas al realizar comparaciones. | |
-l | Visualiza sólo los nombres de fichero en las que coincide. | |
-n | Antepone a cada línea su número de línea y el nombre del archivo. | |
-s | Suprime la visualización de los mensajes de error. | |
-v | Visualiza sólo aquellas líneas en las que no coinciden con el patrón. |
Para conocer la forma de los patrones que puede manejar consultar las secciones sobre sed y expresiones regulares.
EJEMPLOS.
Obviamente, el ejemplo más simple es la búsqueda de una cadena sobre un fichero. En estos casos es más potente utilizar fgrep ya que al tratar sobre cada línea por separado, sin guardar nada en el buffer, puede trabajar sobre ficheros enormes y además de forma rápida.
Así, para encontrar los ficheros en los que aparece el alumno de NIP 314151 en todos los listados de alumnos matriculados (que se encuentran en ficheros de la forma <centro>.lst) haríamos
$ fgrep -l 314151 *.lst
cienz.lst
Observar que esta búsqueda en otros casos no sería segura pues podría haber alumnos cuyo número de teléfono o número de expediente fuera el mismo que el NIP.
Podríamos buscar cuántos titulados hay del plan 1 que no sospechábamos que lo eran. Esto es equivalente a buscar aquellos que empiezan por 1 y tienen N en el campo acabo y S en el campo marca (^I es el tabulador)
$ grep "^1.*N^IS" titulos.lis | wc -l
19
Si nos interesara saber en cuántos titulados nos equivocamos podríamos hacer algo como
$ egrep "N^IS|S^IN" titulos.lis | wc -l
27
Un problema muy frecuente es el de conocer cuáles son los directorios que hay en nuestro directorio de trabajo (sobre todo si el directorio de trabajo contiene muchos ficheros). Una forma simple (cuidado pues si un directorio es en verdad una liga a otro no lo mostrará) es
$ ll | grep "^d" # Mirar esta opción: ll | grep "^[dl]"
Más aún podría interesarnos buscar aquellos usuarios que no tengan contraseña. Una forma sutil es
$ grep '^[^:]*::' passwd.lis
Su significado es: busca aquellas líneas que empiecen por algo distinto de ':' hasta encontrar dos caracteres ':' seguidos (no hay nada en ese campo que es justamente el campo donde está la clave).
require("$webroot/pie.php") ?>