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ámetro | Descripción |
---|---|
-i | Ignora mayúsculas y minúsculas (ejemplo: también encuentra sancho panza ) |
-v | Filtra a la inversa, es decir, sólo líneas que no contienen el patrón. |
-n | Añade al principio el número de la línea. |
-r | Buscando en ficheros, busca también en subcarpetas de forma recursiva. |
-c | Só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.