Una de las operaciones mas habituales que hacemos en cualquier ámbito de nuestra vida es buscar. A menos que tengas una organización exquisita siempre andas buscando. Incluso aún en el caso de que hagas gala de esa organización exquisita, tarde o temprano necesitas buscar, porque siempre llega el momento en que no sabes donde dejaste algo. En estos momentos, en que el almacenamiento se ha convertido en un bien relativamente económico, almacenar ha dejado de ser un lujo. Y, por supuesto, no solo almacenamos, lo que encontramos por ahí, sino que también guardamos todo lo que hacemos, y cada vez hacemos más y más rápido. Entonces ¿como encontrar aquello que buscamos de forma efectiva y rápida? Para esto, tienes un fantástica herramienta, llamada rigpgrep
que te va a permitir realizar las búsquedas a la velocidad del rayo.
Buscando en archivos de texto a la velocidad del rayo
Sobre ripgrep
ripgrep
es una aplicación multiplataforma, disponible para Linux, Windows y MacOS, desarrollada en Rust que se utiliza para buscar texto en archivos y directorios. Se trata de una herramienta alternativa a grep, que se centra en la velocidad y la facilidad de uso.
Características de ripgrep
Algunas caraterísticas de ripgrep son las siguientes,
- Soporte para expresiones regulares PCRE (Perl Compatible Regular Expressions).
- Capacidad para buscar en subdirectorios de forma recursiva de manera predeterminada.
- Capacidad para ignorar archivos y directorios específicos utilizando expresiones regulares.
- Soporte para la mayoría de los formatos de codificación de caracteres, incluyendo UTF-8, UTF-16 y otros.
- Detección automática del tipo de archivo para evitar la búsqueda en archivos binarios.
La velocidad es una de las características clave de ripgrep. En general, es más rápido que otras herramientas de búsqueda de texto en línea de comandos, como grep, ag y ack. ripgrep utiliza la paralelización de CPU y la eliminación temprana para reducir el tiempo de búsqueda.
¿Como puedo instalar ripgrep?
Como te decía ripgrep
es una herramienta multiplataforma, con lo que tienes distintas opciones para instalarla, y depende de la plataforma. Así por ejemplo, en Linux, ripgrep se puede instalar utilizando gestores de paquetes como apt-get, dnf o pacman, o utilizando el gestor de paquetes de Rust, Cargo.
En macOS, ripgrep se puede instalar utilizando Homebrew, el gestor de paquetes de macOS, o utilizando el gestor de paquetes de Rust, Cargo.
En Windows, ripgrep se puede instalar utilizando Chocolatey, el gestor de paquetes de Windows, o utilizando el gestor de paquetes de Rust, Cargo. También se puede descargar una versión precompilada de ripgrep desde el sitio web oficial de ripgrep.
¿Que ventajas presenta ripgrep frente a herramientas como grep?
- Rendimiento: ripgrep es considerablemente más rápido que grep y otras herramientas similares. Utiliza una combinación de paralelismo y algoritmos de búsqueda optimizados para realizar búsquedas de texto más rápidas. Además, ripgrep está diseñado para buscar solo en archivos de texto, ignorando automáticamente archivos binarios y otras entradas que no son de texto, lo que ahorra tiempo de procesamiento.
- Facilidad de uso: ripgrep tiene una sintaxis de línea de comandos simple y fácil de recordar, que es similar a la sintaxis de grep. Además, ripgrep tiene una serie de opciones de línea de comandos útiles, como la capacidad de ignorar archivos o directorios específicos, que lo hacen muy fácil de utilizar.
- Funcionalidades adicionales: ripgrep es compatible con la mayoría de las expresiones regulares compatibles con Perl, lo que significa que puede realizar búsquedas más avanzadas y precisas. Además, ripgrep tiene opciones de formato de salida avanzadas, como la capacidad de mostrar el número de líneas que coinciden con una búsqueda.
- Portabilidad: ripgrep es una herramienta multiplataforma, lo que significa que se puede utilizar en varios sistemas operativos, incluyendo Linux, macOS y Windows. Además, al estar escrito en Rust, ripgrep es fácil de compilar para otras plataformas.
En resumen, ripgrep es una herramienta de búsqueda de texto rápida, fácil de usar y versátil, que ofrece varias ventajas sobre herramientas de búsqueda de texto más antiguas como grep.
Algunos ejemplos de uso de ripgrep
- Buscar una cadena de texto en un archivo,
rg "cadena_de_texto" archivo.txt
- Buscar una cadena de texto en varios archivos en un directorio
rg "cadena_de_texto" /ruta/al/directorio/
- Buscar una cadena de texto en varios archivos en un directorio y en subdirectorios de manera recursiva:
rg "cadena_de_texto" /ruta/al/directorio/ -r
- Buscar una cadena de texto en varios archivos, ignorando archivos o directorios específicos:
rg "cadena_de_texto" /ruta/al/directorio/ --exclude-dir=subdir --exclude=archivo.txt
- Buscar una cadena de texto utilizando expresiones regulares:
rg "patron_regexp" /ruta/al/directorio/ -E
- Contar el número de líneas que contienen una cadena de texto en un archivo:
rg -c "cadena_de_texto" archivo.txt
- Ver el contexto alrededor de una cadena de texto en un archivo:
rg "cadena_de_texto" archivo.txt -C 3
Supongamos que tienes un proyecto de código fuente en Python y quieres buscar todas las funciones que contengan la palabra «error» en un directorio y en subdirectorios de manera recursiva, pero ignorando los archivos que están en el directorio venv donde se encuentran las dependencias de Python.
Para hacer esto, puedes usar el siguiente comando,
rg --no-filename --color "error" /ruta/al/directorio/ -r -g '!venv/*' -G '*.py'
Aquí te explico las opciones utilizadas,
--no-filename
: hace queripgrep
no muestre el nombre de archivo en la salida, lo que facilita la lectura.--color
: resalta la cadena de búsqueda en la salida para que sea más fácil de ver./ruta/al/directorio/
: el directorio donde se va a realizar la búsqueda.-r
: buscar de manera recursiva en subdirectorios.-g '!venv/*'
: ignorar archivos en el directoriovenv
.-G '*.py'
: buscar solo en archivos con extensión.py
.
Este comando buscará todas las funciones que contengan la palabra «error» en los archivos Python
de un proyecto, ignorando los archivos en el directorio venv
donde se encuentran las dependencias de Python
.
Supongamos que tienes un proyecto de código fuente en varios lenguajes de programación y quieres buscar todas las llamadas a la función foo()
que contengan la palabra «error» en un directorio y en subdirectorios de manera recursiva, pero ignorando los archivos que están en el directorio vendor
donde se encuentran las dependencias del proyecto. Además, quieres que ripgrep
muestre el contexto de cada coincidencia de búsqueda, pero solo la línea donde se encuentra la llamada a foo()
y las 2 líneas anteriores y posteriores. Y por último, quieres que ripgrep
genere un archivo de salida con las líneas coincidentes.
Para hacer esto, puedes usar el siguiente comando,
rg --no-filename --color "foo.*error" /ruta/al/directorio/ -r -g '!vendor/*' -G '*.py' -C 2 -o --context-separator="" > output.txt
Aquí te explico las opciones utilizadas,
--no-filename
: hace queripgrep
no muestre el nombre de archivo en la salida, lo que facilita la lectura.--color
: resalta la cadena de búsqueda en la salida para que sea más fácil de ver./ruta/al/directorio/
: el directorio donde se va a realizar la búsqueda.-r
: buscar de manera recursiva en subdirectorios.-g '!vendor/*'
: ignorar archivos en el directoriovendor
.-G '*.py'
: buscar solo en archivos con extensión.py
.-C 2
: mostrar 2 líneas de contexto antes y después de cada coincidencia de búsqueda.-o
: solo mostrar las líneas que coinciden con la búsqueda.--context-separator=""
: no mostrar la línea de separación entre cada coincidencia de búsqueda.> output.txt
: redirigir la salida deripgrep
a un archivo llamadooutput.txt
.
Este comando buscará todas las llamadas a la función foo()
que contengan la palabra «error» en los archivos Python
de un proyecto, ignorando los archivos en el directorio vendor
. Además, mostrará el contexto de cada coincidencia de búsqueda, pero solo la línea donde se encuentra la llamada a foo()
y las 2 líneas anteriores y posteriores. Por último, generará un archivo de salida llamado output.txt
con las líneas coincidentes.
El vídeo
Lo mismo que te he contado hasta aquí pero en formato vídeo,