grep con Bash

Comando grep para Linux

El comando grep de Linux es una increíble herramienta de búsqueda y filtrado de texto. Se utiliza principalmente para buscar patrones de texto en archivos de texto o flujos de datos y mostrar las líneas que tienen coincidencias.

grep [opciones] patrón [archivo] [otro_archivo]

Vamos a ver un ejemplo básico de búsqueda por patrón en un archivo que casi con seguridad tienes en tu equipo, el archivo /etc/passwd. Por el momento trabajaremos con un solo fichero de texto y no tendremos en cuenta las opciones disponibles para este comando.

grep patrón [archivo]

En el ejemplo buscaremos el patrón «PostgreSQL» y lo buscaremos en el fichero que comentamos antes /etc/passwd. Si no te aparece nada porque no tienes a ese usuario puedes hacer la prueba cambiando el patrón por «root» o por el nombre de tu usuario.

Hemos obtenido una línea que tiene una coincidencia con el patrón elegido. Podemos ver que aparece en color rojo la palabra «PostgreSQL».

grep "PostgreSQL" /etc/passwd
Haciendo una búsqueda con grep usando de patrón "PostgreSQL" en el archivo /etc/passwd

Para trabajar con dos ficheros que contengan información más parecida a los textos con los que estamos acostumbrados a leer, vamos a trabajar con lorem.txt y lorem_copia.txt que son dos documentos que se crearon en esta entrada.

Haremos una búsqueda con el patrón «profesor» en los dos ficheros a la vez.

grep "profesor" lorem.txt lorem_copia.txt

Vemos que con el patrón «profesor» en el primer fichero hay seis coincidencias y en el segundo fichero solo una.

Realizandando una búsqueda con el comando grep y de patrón "profesor" en dos ficheros

Búsqueda a flujo de datos con grep

Vamos realizar otra búsqueda pero en vez de hacerla a un fichero de texto, la haremos a un flujo de datos que se genere anteriormente con el uso de otro comando. Aunque para esto haya que hacer uso de las conocidas tuberías de Linux.

El operador de tubería (pipe) | se encarga de redirigir la salida del comando ls -l al comando grep.

Para ser más exactos, haremos una búsqueda del patrón «er» con el flujo de datos que genere el comando ls -l. Para realizar esta búsqueda voy a situarme en una ubicación en la que sé que realizando esta búsqueda encontraré resultados.

ls -l | grep "er"

También realizaré una búsqueda con el patrón «40» con el mismo flujo que se genere del comando ls -l.

ls -l | grep "40"
Realizandando dos búsquedas con el comando grep a un flujo generado por ls -l con los patrones "er" y "40"

Podríamos generar de forma sencilla un documento llamado resultado.txt con las coincidencias que hemos encontrado. Usaremos el doble mayor que >> por si el fichero ya existe actualizarlo.

ls -l | grep "er" >> resultado.txt
ls -l | grep "40" >> resultado.txt
cat resultado.txt

Para crear nuestros patrones de búsquedas podemos usar expresiones regulares -E (extendidas extended regexp) y expresiones regulares -P (Perl PCRE). Pero las expresiones regulares no las vamos a ver en esta entrada, dedicaremos una entera para ellas.

Opciones para grep en Bash

Las opciones son modificadores que podemos incluir en nuestro comando grep de Linux para personalizar el comportamiento y añadirle potencia extra. Podemos ver todas las opciones disponibles escribiendo en la terminal man grep.

  • -i: ignora mayúsculas y minúsculas al realizar la búsqueda.
  • -v: invierte la búsqueda mostrando las líneas que no coinciden con el patrón indicado.
  • -n: muestra los números de línea al lado de las coincidencias.
  • -r: realiza una búsqueda recursiva en directorios y subdirectorios.
  • -r –exclude-dir=»nombre_directorio»: complementa a la opción anterior -r y permite excluir a un directorio en una búsqueda recursiva.
  • -w: obliga a coincidir palabras completas en vez de trozos de palabras.

Vamos a realizar un ejemplo haciendo uso de las opciones que acabamos de ver. Recuerda que usar las opciones de esta forma -v -i es lo mismo que usarlas así -vi, la modificación que realizamos en el comando es la misma de las dos formas.

grep -r --exclude-dir="ergo_folder" -i -n -w "bar"
grep -inwr --exclude-dir="ergo_folder" "bar"

Con este comando estamos buscando de forma recursiva (excluyendo al directorio ergo_folder) en el directorio que estemos situados, todas las líneas que tengan la palabra bar (haciendo coincidir la palabra completa), independientemente de si está escrita en mayúscula o minúscula. El resultado nos lo mostrará en pantalla indicando el número de cada línea.

Realizandando una búsqueda con las opciones -i -n -w -r --exclude-dir con el patrón "bar"

Podríamos haber empezado la búsqueda recursiva indicando un directorio concreto después del patrón.

grep -inwr --exclude-dir="ergo_folder" "bar" diccionario/

Para este ejemplo concreto hubiésemos encontrado los mismos resultados, ya que todas las coincidencias anteriores provienen del mismo directorio que le hemos indicado para que comience la búsqueda recursiva, el directorio «diccionario«.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *