Archivos en la Categoría: grep

Buscando Patrones en un Archivo con el Comando grep. Tuberías.

EL COMANDO grep:
Supongamos que tenemos un archivo con una lista de nombres, digamos alumnos de una clase, y queremos encontrar a todos aquellos que se apelliden Cervantes.
Una forma fácil de hacerlo es con el comando grep:

grep Cervantes Archivo.dat

que produce la salida:

Mario Cervantes
Carmen Cervantes

grep desplegará las líneas que contienen Cervantes, incluso si es parte de una palabra más grande, como Cervantesaavedra.
La forma general del comando grep es la siguiente:

grep Patron Archivo1 Archivo2

Supongamos, por ejemplo, que no solamente tenemos un grupo de alumnos, sino 2, y los nombres de los alumnos están escritos en Archivo.txt y Archivo.dat, entonces la línea

grep Cervantes Archivo.dat Archivo.txt

produce

Archivo.txt:Mario Cervantes
Archivo.txt:Carmen Cervantes
Archivo.dat:Josefina Cervantes
Archivo.dat:Jose Luis Cervantes

que indica los nombres que incluyen Cervantes y dicen además de qué archivo viene. O, usando el comodín asterísco

grep Cervantes Archivo*

que produce el mismo resultado, si es que no hay otro(s) archivo(s) cuyo nombre empiece con la palabra Archivo que también contenga(n) la cadena Cervantes.
CONECTANDO COMANDOS POR MEDIO DE TUBERÍAS:
Si no indicamos algún archivo para grep, entonces toma los datos de la salida estándar. Por ejemplo. Supongamos que en el sistema hay muchos usuarios pero en particular queremos saber si el usuario elisa está logueado. Para saberlo podríamos usar una linea como esta:

who | grep elisa

y podríamos obtener algo como:

elisa pts/0        2012-06-22 21:38 (:0)
elisa pts/1        2012-06-22 22:14 (:0)
elisa pts/3        2012-06-22 23:07 (:0)
elisa pts/4        2012-06-23 00:09 (:0)

el comando who nos dice qué usuarios están en el sistema. La barra es una conexión o “tubería” entre who y grep. | toma la salida de who y la envía como entrada a grep. El comando grep entonces busca la cadena elisa dentro de la salida de who.
En este par de ejemplos, grep se ha usado como filtro. Debido a que who puede devolver decenas de líneas, es necesario filtrar esa información. El comando grep es un filtrador natural en Unix.
BUSCANDO UN PATRÓN SIN IMPORTAR MAYÚSCULAS O MINÚSCULAS:
Podría ocurrir que en alguno de los archivos en los que estamos buscando el apellido Cervantes, apareciera el apellido de una manera distinta. Digamos CERVANTES o cervantes; en este caso, con la sola instrucción grep Cervantes Archivo no se obtiene ningún resultado. Para buscar coincidencias de cadenas sin importar si las letras son mayúsculas o minúsculas, existe la opción -i en el comando grep:

grep -i Cervantes Archivo.dat

y obtenemos la salida

Josefina Cervantes
Jose Luis Cervantes
Fernando cervantes

que indica que en Archivo.dat había alguien con apellido Cervantes, que no se mostraba antes, porque la primera letra estaba en minúsculas.
BUSCANDO CADENAS CON ESPACIOS EN BLANCO
El comando grep también puede ser usado para encontrar expresiones que contengan espacios en blanco. Por ejemplo, vamos a suponer que deseamos encontrar en nuestra lista de alumnos en Archivo.dat a el alumno Elisa Griensen. Para hacer la búsqueda bastará colocar como patrón ese nombre entre comillas sencillas ‘ o comillas dobles “:

grep 'Elisa Griensen' -i Archivo.dat

En donde, puesto que ya conocemos a nuestro capturista de datos, hemos puesto la opción -i para indicarle a grep que no debe de tomar en cuenta diferencias entre mayúsculas y minúsculas. Esta opción puede ir antes o después del patrón. Al ejecutarlo podemos encontrar:

Elisa griensen

y por la salida, que indica el apellido griensen en minúsculas, sabemos que hemos hecho bien en incluir la opción -i.

INDICANDO EL NÚMERO DE LÍNEA DE LAS COINCIDENCIAS DEL PATRÓN
Si el archivo donde tenemos nuestra lista de estudiantes es muy grande, tal vez nos interesaría saber en qué línea exactamente está nuestra coincidencia. Por ejemplo Elisa Griensen. Para ésto usamos la opción -n del comando grep

grep 'Elisa Griensen' -in Archivo.dat

y obtenemos:

6:Elisa griensen

En la línea anterior usamos las opciones i y n como una combinación mediante -in
¿Y POR QUÉ SE LLAMA grep?
En editor de textos ed, para buscar un patrón en un archivo se usa la expresión g/re/p para buscar la expresión contenida entre las diagonales / / (expresión regular) e imprimirlas. De ahí el natural nombre de grep para el comando Unix que hace la misma tarea.