Cómo excluir patrones, archivos y directorios con grep
Desde 1974, el equipo de Linux ha estado grep
ayudando a las personas a encontrar líneas en los archivos. Pero a veces grep
con demasiado cuidado. Aquí hay algunas maneras de decir grep
ignorar diferentes cosas.
comando grep
El comando grep
busca en archivos de texto líneas que coincidan con los patrones de búsqueda especificados en la línea de comando. El poder grep
radica en el uso de expresiones regulares. Le permiten describir lo que está buscando en lugar de definirlo explícitamente.
El nacimiento grep
es 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 ed
el editor de línea (pronunciado «ee-dee» por cierto). Esto significó una búsqueda rápida global y regular, imprimiendo líneas coincidentes.
grep
conocido, 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, grep
puede 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 -v
opció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 -e
opció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 -E
opción (expresiones regulares extendidas), podemos combinar patrones de búsqueda con » |
«, que en este contexto no indica un canal, es un OR
operador 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 grep
pasar 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 grep
buscar 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 --exclude
opció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 -R
opción (dereference-recursive), grep
buscará 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 --exclude
pará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-dir
pará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-dir
opció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