Saltar la navegación

grep

La familia grep está formada por tres filtros: grep, egrep, y fgrep. En general, esta familia de programas selecciona aquellas líneas de la entrada (ficheros o entrada estándar), que contienen un texto que concuerda con la expresión regular especificada, y normalmente las copia en la salida estándar.

La orden grep busca líneas que contengan la o las expresiones regulares básicas especificadas y muestra dichas líneas por la salida estándar. Su sintaxis es la siguiente:

grep [opción...] expresión_regular_básica [fichero...]

Si no se especifica ningún fichero, grep leerá de la entrada estándar.

$ cat f1.txt 
comida
casiseta
playa
ciclismo
campeonato
estudiar
ambicioso
estado
$ grep 'am' f1.txt
campeonato
ambicioso
$ grep '^am' f1.txt
ambicioso

Si queremos mostrar las líneas en las que no se encuentra el patrón, usaremos la opción -v:

$ grep -v 'am' f1.txt
comida
casiseta
playa
ciclismo
estudiar
estado

Para mostrar junto a las líneas que se muestran su número de línea dentro del fichero, debemos usar la opción -n.

$ grep -n 'am' f1.txt
5:campeonato
7:ambicioso

Si lo que nos interesa es saber únicamente el total de líneas que contienen el patrón (o que no lo contienen, -v), usaremos la opción -c:

$ grep -c 'am' f1.txt
2

Podemos hacer que grep busque varios patrones, para lo cual debemos escribirlos uno por línea en un fichero e indicárselo con la opción -f:

$ grep -f patrones f1.txt
comida
casiseta
playa
campeonato
ambicioso

Podemos mostrar solo el nombre de los ficheros con (o sin, -v) lineas en las que se encuentra el patrón, usando la opción -l, o lo contrario con -L.

$ grep -l 'am' f1.txt f2.txt f3.txt
f1.txt
$ grep -L 'am' f1.txt f2.txt f3.txt
f2.txt
f3.txt
$ grep -lv 'am' f1.txt f2.txt f3.txt
f1.txt
f2.txt
f3.txt
$ grep -Lv 'am' f1.txt f2.txt f3.txt

Podemos hacer con la opción --color que las coincidencias de la expresión regular aparezcan en color:

$ grep --color 'am' f1.txt
campeonato
ambicioso

No tenemos por qué buscar todas las coincidencias, el proceso puede pararse tras encontrar n líneas que concuerden, para ello usaremos la opción -m:

$ grep -m 1 'am' f1.txt
campeonato

La opción -o muestra solo los trozos de las líneas que coinciden con el patrón. Si el patrón está en varios sitios de una misma línea, se mostrarán todas las coincidencias una por línea.

$ ls -l | grep -o '3[0-9]'
30
36
37
37

La opción -b muestra la posición dentro del fichero del primer carácter de las líneas que coinciden con el patrón. Si va con -o sería la posición dentro del fichero del primer carácter de la coincidencia. La posición del primer carácter del fichero es la 0.

$ grep -b 'am' f1.txt
31:campeonato
51:ambicioso
$ grep -bo 'am' f1.txt
32:am
51:am

Existen una serie de opciones que permiten mostrar la línea de la coincidencia y su contexto. Por ejemplo, la opción -A muestra el número especificado de líneas que siguen a la línea de la coincidencia.

$ grep -A 1 'am' f1.txt
campeonato
estudiar
ambicioso
estado

Otras opciones para grep son:

-w     El patrón debe casar con una palabra (secuencia de letras, dígitos y _).
-e patrón   Útil para cuando el patrón comienza con un guión (-), pues se confundiría con opciones.
-i Para no tener en cuenta la diferencia entre mayúsculas y minúsculas.
-q No muestra nada por pantalla. Solo devuelve como valor de salida un 0 si ha encontrado coincidencias o un 1 en caso contrario. Útil fundamentalmente con scripts, donde solo interese saber si hay o no coincidencias.
-H Muestra el nombre del fichero delante de la línea.
-B n Muestra las n líneas que preceden a las líneas con coincidencias.
-C n Muestra las n líneas que preceden y suceden a las líneas con coincidencias. Como especificar -A n y -B n juntas.
-r Busca recursivamente en los directorios especificados.
-E Hace que grep funcione como egrep.
-F Hace que grep funcione como fgrep.
-G Hace que grep funcione como grep. Es la opción por defecto de grep. Es para utilizar con fgrep o egrep, que también poseen esta opción.
-h Cuando se especifica más de un fichero de búsqueda, delante de la línea aparece el nombre del fichero. Para evitar esto, está la opción -h.
-x Se obliga a que el patrón coincida con la línea completa.
--exclude=patrón  
Excluye de la búsqueda todos aquellos ficheros cuyo nombre concuerde con patrón, que está expresado como en la expansión de ficheros.
--exclude-from=fichero Excluye de la búsqueda todos aquellos ficheros cuyo nombre concuerde con alguno de los patrones (de expansión de ficheros) que se encuentran en fichero.
--exclude-dir=patrón Excluye en una búsqueda recursiva todos los directorios cuyo nombre coincida con patrón (de expansión de ficheros).

Licencia: licencia de software libre GPL