Grep: Filtrando información

Quedándonos sólo con lo que nos interesa


En temas anteriores hemos aprendido a mostrar información del contenido de un archivo o mostrar el contenido de una carpeta (archivos y subdirectorios). En este tema vamos a ver cómo podemos filtrar la información que nos muestra, para quedarnos sólo con lo que nos interesa.

Filtrar información

Como hemos mencionado, vamos a ver formas de filtrar información, descartar la que no nos es relevante y quedarnos sólo con la que nos interesa.

El comando grep es una herramienta super útil que conviene aprender cuanto antes. Se trata de una herramienta que nos permite filtrar información, excluyendo la parte que no nos interesa y quedándonos con la que sí.

Por ejemplo, vamos a trabajar con un documento bastante grande: el quijote.txt. Así pues, escribimos los siguientes comandos:

# Instala wget si no lo tenemos aún instalado
$ sudo apt install wget

# Descargamos el quijote.txt (url entera en el enlace anterior)
$ wget "https://gist.githubusercontent.com/ManzDev/.../quijote.txt"

# Mostramos el contenido del quijote.txt
$ cat quijote.txt

Al hacer un cat quijote.txt nos aparecerá el contenido del Quijote, que serán muchas lineas. Sin embargo, quizás nos interesa sólo el contenido donde sale el texto Sancho Panza. Para filtrar por ese texto podemos hacer lo siguiente:

$ grep "Sancho Panza" quijote.txt

tendrás del famoso Sancho Panza, su escudero, en quien, a mi parecer, te
   Soy Sancho Panza, escude-
   que Sancho Panza fue mal alcagüete,
della. Con estas promesas y otras tales, Sancho Panza, que así se llamaba
Iba Sancho Panza sobre su jumento como un patriarca, con sus alforjas y su
fatigaban. Dijo en esto Sancho Panza a su amo:
...

Observa que lo que ha hecho es filtrar sólo las líneas donde aparece "Sancho Panza". Como puedes imaginar, esto es tremendamente útil. Además, tenemos algunos parámetros que pueden resultarnos interesantes:

ParámetroDescripción
-iIgnora mayúsculas y minúsculas (ejemplo: también encuentra sancho panza)
-vFiltra a la inversa, es decir, sólo líneas que no contienen el patrón.
-nAñade al principio el número de la línea.
-rBuscando en ficheros, busca también en subcarpetas de forma recursiva.
-cSólo cuenta el número de veces que encuentra el texto.

El comando fzf (fuzzy finder) es una herramienta moderna para filtrar información en tiempo real, de forma interactiva, lo que suele ser bastante más práctico que usar grep.

Sin embargo, no suele venir instalada por defecto y requiere algunos pasos extra para hacerla funcionar. Aún así, es muy sencillo instalarla:

# Asegurate de tener instalado esto
$ sudo apt install git wget curl

# Descargamos el instalador de fzf
$ git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf

# Lo instalamos
$ ~/.fzf/install

# El instalador preguntará algunos detalles
Do you want to enable fuzzy auto-completion? ([y]/n) y
Do you want to enable key bindings? ([y]/n) y
Generate /root/.fzf.bash ... OK

Do you want to update your shell configuration files? ([y]/n) y

Finished. Restart your shell or reload config file.
   source ~/.bashrc  # bash

Al terminar, simplemente ejecutamos source ~/.bashrc para que los cambios tengan efecto.

Ahora, para utilizar fzf simplemente hacemos lo siguiente:

$ cat quijote.txt | fzf

Esto mostrará el contenido de quijote.txt, pero activará un filtro en tiempo real que te permitirá ir escribiendo lo que quieres filtrar. Para salir, simplemente pulsa CTRL + C.

De hecho, también lo tendremos integrado para utilizarse junto a otras funcionalidades, como por ejemplo, la búsqueda en el historial de comandos, pulsando CTRL + R.

Una alternativa a grep es ripgrep, aunque el comando son sus iniciales: rg. Está creado en Rust, por lo que puede ser instalado con un cargo install ripgrep. Una vez instalado, podemos utilizarlo con la sintaxis similar a grep:

$ rg "Sancho Panza" quijote.txt
310:tendrás del famoso Sancho Panza, su escudero, en quien, a mi parecer, te
470:   Soy Sancho Panza, escude-
546:   que Sancho Panza fue mal alcagüete,
2001:della. Con estas promesas y otras tales, Sancho Panza, que así se llamaba
2024:Iba Sancho Panza sobre su jumento como un patriarca, con sus alforjas y su
...

Observa, que en verde aparece el número de la línea. El rendimiento de ripgrep suele ser un poco más rápido que el grep tradicional.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev