Cómo excluir patrones, archivos y directorios con grep

Desde 1974, el equipo de Linux ha estado grepayudando a las personas a encontrar líneas en los archivos. Pero a veces grepcon demasiado cuidado. Aquí hay algunas maneras de decir grepignorar diferentes cosas.

comando grep

El comando grepbusca en archivos de texto líneas que coincidan con los patrones de búsqueda especificados en la línea de comando. El poder grepradica en el uso de expresiones regulares. Le permiten describir lo que está buscando en lugar de definirlo explícitamente.

El nacimiento grepes anterior a Linux. fue desarrollado a principios de la década de 1970 para Unix. Obtiene su nombre de la secuencia de teclas g/re/p en edel editor de línea (pronunciado «ee-dee» por cierto). Esto significó una búsqueda rápida global y regular, imprimiendo líneas coincidentes.

grepconocido, tal vez notorio, por ser minucioso y decidido. A veces buscará archivos o directorios en los que preferiría no perder el tiempo porque los resultados pueden hacer que los árboles le impidan ver el bosque.

Por supuesto, hay formas de controlar grep. Puede indicarle que ignore patrones, archivos y directorios para que grep busque más rápido y no se vea inundado con falsos positivos sin sentido.

Exclusión de patrones

Para buscar, greppuede dirigir la entrada desde algún otro proceso, como cat, o puede especificar un nombre de archivo como el último argumento de la línea de comandos.

Estamos utilizando un archivo corto que contiene el texto del poema  Jabberwocky de Lewis Carroll. En estos dos ejemplos, estamos buscando cadenas que coincidan con el término de búsqueda «jabberwock».

cat jabberwocky.txt | grep "Jabberwock"grep "Jabberwock"jabberwocky.text

Las filas que contienen coincidencias con una sugerencia de búsqueda se enumeran para nosotros, con el elemento correspondiente en cada fila resaltado en rojo. Esta es una búsqueda directa. Pero, ¿y si queremos excluir las líneas que contienen la palabra «Jabberwock» e imprimir el resto?

Podemos lograr esto con la -vopción (invertir coincidencia). Esto enumera las cadenas que no coinciden con la consulta de búsqueda.

grep -v "Jabberwock"jabberwocky.text

Las líneas que no contienen «Jabmaglot» se muestran en la ventana del terminal.

Podemos excluir tantos términos como queramos. Filtremos todas las líneas que contengan «Jabberwock» y todas las líneas que contengan «y». Para ello utilizaremos una -eopción (expresión). Necesitamos usarlo para cada patrón de búsqueda que usamos.

grep -v -e "Jabberwock"-e "and"jabberwocky.txt

Una disminución correspondiente en el número de líneas en la salida.

Si usamos la -Eopción (expresiones regulares extendidas), podemos combinar patrones de búsqueda con » |«, que en este contexto no indica un canal, es un ORoperador lógico.

grep -Ev "Jabberwock|and"jabberwocky.txt

Obtenemos exactamente el mismo resultado que con el comando anterior más largo.

El formato del comando es el mismo si desea utilizar un patrón de expresión regular en lugar de una sugerencia de búsqueda explícita. Este comando excluirá todas las líneas que comiencen con cualquier letra del conjunto «ACHT».

grep -Ev "^ACHT"jabberwocky.txt

Para ver líneas que contienen un patrón pero no otro patrón, podemos greppasar grep. Buscaremos todas las líneas que contengan la palabra «jabberwock» y luego filtraremos todas las líneas que también contengan la palabra «asesinado».

grep "Jabberwock"jabberwocky.txt | grep -v "slain"

Exclusión de archivos

Podemos pedir grepbuscar una cadena o patrón en un conjunto de archivos. Puede enumerar cada archivo en la línea de comando, pero con muchos archivos, este enfoque no se escala.

grep "vorpal"verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt

Tenga en cuenta que el nombre del archivo que contiene la línea coincidente aparece al principio de cada línea de salida.

Para acortar la entrada, podemos usar comodines. Pero esto puede ser contradictorio. Parece funcionar.

grep "vorpal"*.txt

Sin embargo, hay otros archivos TXT en este directorio que no tienen nada que ver con el poema. Si buscamos la palabra «espada» con la misma estructura de comandos, obtendremos muchos falsos positivos.

grep "sword"*.txt

Los resultados que necesitamos están enmascarados por una secuencia de resultados falsos de otros archivos TXT.

La palabra «vorpal» no correspondía a nada, pero la palabra «espada» está incluida en la palabra «contraseña», por lo que aparecía muchas veces en algunos archivos de pseudo-log.

Necesitamos excluir estos archivos. Para ello, utilizamos la --excludeopción. Para excluir un archivo llamado «vol-log-1.txt», usaríamos este comando:

grep --exclude=vol-log-1.txt "sword"*.txt

En este caso, queremos excluir múltiples archivos de registro con nombres que comiencen con «vol». La sintaxis que necesitamos es:

grep --exclude=vol*.txt "sword"*.txt

Cuando usamos la -Ropción (dereference-recursive), grepbuscará todos los árboles de directorios por nosotros. De manera predeterminada, buscará todos los archivos en estas ubicaciones. Puede haber varios tipos de archivos que queramos excluir.

En el directorio actual de esta máquina de prueba, hay subdirectorios que contienen archivos de registro, archivos CSV y archivos MD. Estos son todos los tipos de archivos de texto que queremos excluir. Podríamos usar un --excludeparámetro para cada tipo de archivo, pero podemos lograr lo que queremos de manera más eficiente agrupando los tipos de archivo.

Este comando excluye todos los archivos con extensiones .csv o .md, así como todos los archivos .txt cuyos nombres comienzan con «vol» o «log».

grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword"/home/dave/data/

Excluyendo directorios

Si los archivos que queremos ignorar están contenidos en directorios y esos directorios no contienen los archivos que queremos encontrar, podemos excluir esos directorios por completo.

El concepto es muy similar a la exclusión de archivos, excepto que usamos un --exclude-dirparámetro y nombramos los directorios que se ignorarán.

grep -R --exclude-dir=backup "vorpal"/home/dave/data

Hemos excluido el directorio «backup», pero todavía estamos buscando en otro directorio llamado «backup2».

No en vano, podemos usar esta --exclude-diropción varias veces en el mismo comando. Tenga en cuenta que la ruta a los directorios excluidos debe ser relativa al directorio donde comenzará la búsqueda. No utilice una ruta absoluta desde la raíz del sistema de archivos.

grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal"/home/dave/data

También podemos usar agrupaciones. Podemos lograr el mismo resultado de manera más concisa:

grep -R --exclude-dir={backup,backup2} "vorpal"/home/dave/data

Puede combinar exclusiones de archivos y directorios en un solo comando. Si desea excluir todos los archivos de un directorio y ciertos tipos de archivos de los directorios de búsqueda, use esta sintaxis:

grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious"/home/dave/data

Deja una respuesta

Tu dirección de correo electrónico no será publicada.