Introducción
grep
es una poderosa herramienta de línea de comando que se utiliza para buscar en uno o más archivos de entrada líneas que coincidan con una expresión regular y escribe cada línea coincidente en la salida estándar.
En este artículo, le mostraremos cómo excluir una o más palabras, patrones o directorios al buscar con grep
.
Excluir palabras y patrones
Para mostrar solo las líneas que no coinciden con un patrón de búsqueda, use la opción -v
(o --invert-match
).
Por ejemplo, para imprimir líneas que no contienen la cadena nologin
que usaría:
grep -wv nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
git:x:994:994:git daemon user:/:/usr/bin/git-shell
noviello:x:1000:1000:noviello:/home/noviello:/bin/bash
La opción le -w
permite grep
devolver solo aquellas líneas donde la cadena especificada es una palabra completa (encerrada por caracteres no alfanuméricos).
De forma predeterminada, distingue entre grep
mayúsculas y minúsculas. Esto significa que los caracteres en mayúsculas y minúsculas se tratan como distintos. Para ignorar mayúsculas y minúsculas al buscar, invoca grep
con la opción -i
.
Si la cadena de búsqueda incluye espacios, debe escribirse entre comillas simples o dobles.
Para especificar dos o más patrones de búsqueda, use la opción -e
:
grep -wv -e nologin -e bash /etc/passwd
Puede utilizar la opción -e
tantas veces como desee.
Otra opción para excluir múltiples patrones de búsqueda es unir los patrones usando el operador OR |
.
El siguiente ejemplo imprime líneas que no contienen cadenas nologin
o bash
:
grep -wv 'nologin\|bash' /etc/passwd
GNU grep
admite tres sintaxis de expresión regular: básica, extendida y compatible con Perl. De forma predeterminada, grep
interpreta el patrón como una expresión regular básica donde los metacaracteres |
pierden su significado especial y debes usar sus versiones de barra invertida.
Si usa la opción de expresión regular extendida -E
, no es necesario escapar del operador |
, como se muestra a continuación:
grep -Ewv 'nologin|bash' /etc/passwd
Puede especificar varias coincidencias posibles que pueden ser cadenas literales o conjuntos de expresiones. En el siguiente ejemplo, se excluyen las líneas games
donde la cadena está al principio de una línea:
grep -v "^games" file.txt
La salida de un comando se puede filtrar grep
mediante una tubería y solo se imprimirán en el terminal las líneas que coincidan con un patrón determinado.
Por ejemplo, para imprimir todos los procesos que se ejecutan en su sistema, excepto los que se ejecutan como usuario "root", puede filtrar la salida del comando ps
:
ps -ef | grep -wv root
Excluir directorios y archivos
A veces, cuando se realiza una búsqueda recursiva con las opciones -r
o -R
, se pueden excluir directorios específicos del resultado de la búsqueda.
La principal diferencia entre las opciones -r
o -R
es que cuando se invoca grep con mayúsculas R
, seguirá todos los enlaces simbólicos .
Para excluir un directorio de la búsqueda, use la opción --exclude-dir
. La ruta al directorio excluido es relativa al directorio de búsqueda.
A continuación, se muestra un ejemplo que muestra cómo buscar la cadena noviello
en todos los archivos incluidos /etc
, excluyendo el directorio /etc/pki
:
grep -R --exclude-dir=pki noviello /etc
Para excluir varios directorios, encierre los directorios excluidos entre llaves y sepárelos con comas sin espacios.
Por ejemplo, para buscar archivos que contengan la cadena 'GNU' en su sistema Linux excluyendo los directorios proc
, boot
y sys
se correría:
grep -r --exclude-dir={proc,boot,sys} gnu /
Al utilizar la coincidencia de comodines, puede excluir archivos cuyo nombre base coincida con el GLOB especificado en la opción --exclude
.
En el siguiente ejemplo, buscamos la cadena en todos los archivos del directorio de trabajo actual noviello
, excluyendo los archivos que terminan en .png
y .jpg
:
grep -rl --exclude=*.{png,jpg} noviello *
Conclusión
El comando le grep
permite excluir plantillas y directorios al buscar archivos.