ripgrep es una herramienta de búsqueda orientada a líneas que busca recursivamente en el directorio actual un patrón de expresiones regulares. De forma predeterminada, ripgrep respetará las reglas de gitignore y omitirá automáticamente archivos/directorios ocultos y archivos binarios. (Para deshabilitar todo el filtrado automático de forma predeterminada, use rg -uuu
). ripgrep tiene soporte de primera clase en Windows, macOS y Linux, con descargas binarias disponibles para cada versión. ripgrep es similar a otras herramientas de búsqueda populares como The Silver Searcher, ack y grep.
Con doble licencia bajo MIT o SIN LICENCIA.
Consulte el REGISTRO DE CAMBIOS para obtener un historial de versiones.
Este ejemplo busca en todo el árbol de fuentes del kernel de Linux (después de ejecutar make defconfig && make -j8
) [AZ]+_SUSPEND
, donde todas las coincidencias deben ser palabras. Los tiempos se recopilaron en un sistema con Intel i9-12900K 5,2 GHz.
¡Recuerde que un único punto de referencia nunca es suficiente! Consulte la publicación de mi blog sobre ripgrep para obtener una comparación muy detallada con más puntos de referencia y análisis.
Herramienta | Dominio | recuento de líneas | Tiempo |
---|---|---|---|
ripgrep (Unicode) | rg -n -w '[AZ]+_SUSPEND' | 536 | 0,082s (1,00x) |
hipergrep | hgrep -n -w '[AZ]+_SUSPEND' | 536 | 0,167s (2,04x) |
git grep | git grep -P -n -w '[AZ]+_SUSPEND' | 536 | 0,273s (3,34x) |
El buscador de plata | ag -w '[AZ]+_SUSPEND' | 534 | 0,443s (5,43x) |
ugrep | ugrep -r --ignore-files --no-hidden -I -w '[AZ]+_SUSPEND' | 536 | 0,639s (7,82x) |
git grep | LC_ALL=C git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 0,727s (8,91x) |
git grep (Unicode) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[AZ]+_SUSPEND' | 536 | 2,670s (32,70x) |
ack | ack -w '[AZ]+_SUSPEND' | 2677 | 2,935s (35,94x) |
Aquí hay otro punto de referencia en el mismo corpus anterior que ignora los archivos gitignore y busca con una lista blanca. El corpus es el mismo que en el punto de referencia anterior, y las banderas pasadas a cada comando garantizan que estén realizando un trabajo equivalente:
Herramienta | Dominio | recuento de líneas | Tiempo |
---|---|---|---|
ripgrep | rg -uuu -tc -n -w '[AZ]+_SUSPEND' | 447 | 0,063s (1,00x) |
ugrep | ugrep -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,607s (9,62x) |
grupo GNU | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,674s (10,69x) |
Ahora pasaremos a buscar en un único archivo grande. Aquí hay una comparación directa entre ripgrep, ugrep y GNU grep en un archivo almacenado en caché en la memoria (~13 GB, OpenSubtitles.raw.en.gz
, descomprimido):
Herramienta | Dominio | recuento de líneas | Tiempo |
---|---|---|---|
ripgrep (Unicode) | rg -w 'Sherlock [AZ]w+' | 7882 | 1,042s (1,00x) |
ugrep | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1,339s (1,28x) |
Grupo GNU (Unicode) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [AZ]w+' | 7882 | 6,577s (6,31x) |
En el punto de referencia anterior, pasar el indicador -n
(para mostrar los números de línea) aumenta los tiempos a 1.664s
para ripgrep y 9.484s
para GNU grep. Los tiempos de ugrep no se ven afectados por la presencia o ausencia de -n
.
Sin embargo, tenga cuidado con los acantilados de rendimiento:
Herramienta | Dominio | recuento de líneas | Tiempo |
---|---|---|---|
ripgrep (Unicode) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1,053s (1,00x) |
Grupo GNU (Unicode) | LC_ALL=en_US.UTF-8 grep -E -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 6,234s (5,92x) |
ugrep | ugrep -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 28,973s (27,51x) |
Y el rendimiento puede caer precipitadamente en todos los ámbitos cuando se buscan patrones en archivos grandes sin oportunidades de optimizaciones literales:
Herramienta | Dominio | recuento de líneas | Tiempo |
---|---|---|---|
ripgrep | rg '[A-Za-z]{30}' | 6749 | 15,569s (1,00x) |
ugrep | ugrep -E '[A-Za-z]{30}' | 6749 | 21,857s (1,40x) |
grupo GNU | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32,409s (2,08x) |
Grupo GNU (Unicode) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8m30s (32,74x) |
Finalmente, un alto número de coincidencias también tiende a mejorar el rendimiento y suavizar las diferencias entre herramientas (porque el rendimiento está dominado por la rapidez con la que se puede manejar una coincidencia y no por el algoritmo utilizado para detectar la coincidencia, en términos generales):
Herramienta | Dominio | recuento de líneas | Tiempo |
---|---|---|---|
ripgrep | rg the | 83499915 | 6,948s (1,00x) |
ugrep | ugrep the | 83499915 | 11,721s (1,69x) |
grupo GNU | LC_ALL=C grep the | 83499915 | 15,217s (2,19x) |
.gitignore
/ .ignore
/ .rgignore
, no buscará archivos ocultos y no buscará archivos binarios. El filtrado automático se puede desactivar con rg -uuu
.rg -tpy foo
limita su búsqueda a archivos Python y rg -Tjs foo
excluye archivos JavaScript de su búsqueda. A ripgrep se le puede enseñar sobre nuevos tipos de archivos con reglas de coincidencia personalizadas.grep
, como mostrar el contexto de los resultados de búsqueda, buscar múltiples patrones, resaltar coincidencias con color y compatibilidad total con Unicode. A diferencia de GNU grep, ripgrep se mantiene rápido y admite Unicode (que siempre está activado).-P/--pcre2
(use PCRE2 siempre) o --auto-hybrid-regex
(use PCRE2 solo si es necesario). Se proporciona una sintaxis alternativa a través de la opción --engine (default|pcre2|auto)
.-E/--encoding
).-z/--search-zip
.En otras palabras, use ripgrep si le gusta la velocidad, el filtrado predeterminado, menos errores y compatibilidad con Unicode.
A pesar de que inicialmente no quería agregar todas las funciones disponibles a ripgrep, con el tiempo, ripgrep ha aumentado el soporte para la mayoría de las funciones que se encuentran en otras herramientas de búsqueda de archivos. Esto incluye la búsqueda de resultados que abarquen varias líneas y la compatibilidad voluntaria con PCRE2, que proporciona soporte de búsqueda y referencia retrospectiva.
En este punto, las razones principales para no usar ripgrep probablemente consistan en una o más de las siguientes:
Generalmente sí. En mi blog hay disponible una gran cantidad de puntos de referencia con análisis detallados de cada uno.
En resumen, ripgrep es rápido porque:
-P/--pcre2
)..gitignore
usando un RegexSet
. Eso significa que una única ruta de archivo se puede comparar con múltiples patrones globales simultáneamente.crossbeam
e ignore
.Andy Lester, autor de ack, ha publicado una excelente tabla que compara las características de ack, ag, git-grep, GNU grep y ripgrep: https://beyondgrep.com/feature-comparison/
Tenga en cuenta que ripgrep ha desarrollado recientemente algunas características nuevas importantes que aún no están presentes en la tabla de Andy. Esto incluye, entre otros, archivos de configuración, passthru, soporte para buscar archivos comprimidos, búsqueda multilínea y soporte opcional para expresiones regulares a través de PCRE2.
Si desea probar ripgrep antes de instalarlo, hay un área de juegos no oficial y un tutorial interactivo.
Si tiene alguna pregunta sobre esto, abra un problema en el repositorio del tutorial.
El nombre binario de ripgrep es rg
.
Los archivos de binarios precompilados para ripgrep están disponibles para Windows, macOS y Linux. Los binarios de Linux y Windows son ejecutables estáticos. Se recomienda a los usuarios de plataformas que no se mencionan explícitamente a continuación que descarguen uno de estos archivos.
Si eres usuario de macOS Homebrew o Linuxbrew , puedes instalar ripgrep desde homebrew-core:
$ brew install ripgrep
Si eres usuario de MacPorts , puedes instalar ripgrep desde los puertos oficiales:
$ sudo port install ripgrep
Si eres usuario de Windows Chocolatey , puedes instalar ripgrep desde el repositorio oficial:
$ choco install ripgrep
Si eres usuario de Windows Scoop , puedes instalar ripgrep desde el depósito oficial:
$ scoop install ripgrep
Si es usuario de Windows Winget , puede instalar ripgrep desde el repositorio Winget-pkgs:
$ winget install BurntSushi.ripgrep.MSVC
Si eres usuario de Arch Linux , puedes instalar ripgrep desde los repositorios oficiales:
$ sudo pacman -S ripgrep
Si eres usuario de Gentoo , puedes instalar ripgrep desde el repositorio oficial:
$ sudo emerge sys-apps/ripgrep
Si eres usuario de Fedora , puedes instalar ripgrep desde los repositorios oficiales.
$ sudo dnf install ripgrep
Si es usuario de openSUSE , ripgrep está incluido en openSUSE Tumbleweed y openSUSE Leap desde 15.1.
$ sudo zypper install ripgrep
Si es usuario de RHEL/CentOS 7/8 , puede instalar ripgrep desde copr:
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo
$ sudo yum install ripgrep
Si eres usuario de Nix , puedes instalar ripgrep desde nixpkgs:
$ nix-env --install ripgrep
Si es usuario de Flox , puede instalar ripgrep de la siguiente manera:
$ flox install ripgrep
Si eres usuario de Guix , puedes instalar ripgrep desde la colección de paquetes oficiales:
$ guix install ripgrep
Si es un usuario de Debian (o un usuario de un derivado de Debian como Ubuntu ), entonces ripgrep se puede instalar utilizando un archivo binario .deb
proporcionado en cada versión de ripgrep.
$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/14.1.0/ripgrep_14.1.0-1_amd64.deb
$ sudo dpkg -i ripgrep_14.1.0-1_amd64.deb
Si ejecuta Debian estable, Debian mantiene oficialmente ripgrep, aunque su versión puede ser anterior al paquete deb
disponible en el paso anterior.
$ sudo apt-get install ripgrep
Si es usuario de Ubuntu Cosmic (18.10) (o más reciente), ripgrep está disponible usando el mismo paquete que Debian:
$ sudo apt-get install ripgrep
(NB: También hay disponibles varias instantáneas para ripgrep en Ubuntu, pero ninguna parece funcionar correctamente y genera una serie de informes de errores muy extraños que no sé cómo solucionar y no tengo tiempo para solucionarlo. Por lo tanto, ya no es una opción de instalación recomendada).
Si eres usuario de ALT , puedes instalar ripgrep desde el repositorio oficial:
$ sudo apt-get install ripgrep
Si eres usuario de FreeBSD , puedes instalar ripgrep desde los puertos oficiales:
$ sudo pkg install ripgrep
Si eres usuario de OpenBSD , puedes instalar ripgrep desde los puertos oficiales:
$ doas pkg_add ripgrep
Si es usuario de NetBSD , puede instalar ripgrep desde pkgsrc:
$ sudo pkgin install ripgrep
Si eres usuario de Haiku x86_64 , puedes instalar ripgrep desde los puertos oficiales:
$ sudo pkgman install ripgrep
Si es usuario de Haiku x86_gcc2 , puede instalar ripgrep desde el mismo puerto que Haiku x86_64 usando la compilación de arquitectura secundaria x86:
$ sudo pkgman install ripgrep_x86
Si eres usuario de Void Linux , puedes instalar ripgrep desde el repositorio oficial:
$ sudo xbps-install -Syv ripgrep
Si eres programador de Rust , ripgrep se puede instalar con cargo
.
strip
en el binario. $ cargo install ripgrep
Alternativamente, se puede usar cargo binstall
para instalar un binario ripgrep directamente desde GitHub:
$ cargo binstall ripgrep
ripgrep está escrito en Rust, por lo que necesitarás obtener una instalación de Rust para poder compilarlo. ripgrep se compila con Rust 1.72.0 (estable) o más reciente. En general, ripgrep rastrea la última versión estable del compilador Rust.
Para construir ripgrep:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
NOTA: En el pasado, ripgrep admitía una función simd-accel
Cargo cuando se usaba un compilador nocturno de Rust. Esto sólo benefició a la transcodificación UTF-16. Dado que requería características inestables, este modo de construcción era propenso a romperse. Debido a eso, se eliminó el soporte. Si desea optimizaciones SIMD para la transcodificación UTF-16, deberá solicitar al proyecto encoding_rs
que utilice API estables.
Finalmente, se puede crear soporte PCRE2 opcional con ripgrep habilitando la función pcre2
:
$ cargo build --release --features 'pcre2'
Habilitar la función PCRE2 funciona con un compilador estable de Rust e intentará encontrar y vincular automáticamente la biblioteca PCRE2 de su sistema a través de pkg-config
. Si no existe ninguno, ripgrep compilará PCRE2 desde el código fuente utilizando el compilador C de su sistema y luego lo vinculará estáticamente al ejecutable final. El enlace estático se puede forzar incluso cuando hay una biblioteca del sistema PCRE2 disponible, ya sea creando ripgrep con el objetivo MUSL o configurando PCRE2_SYS_STATIC=1
.
ripgrep se puede compilar con el destino MUSL en Linux instalando primero la biblioteca MUSL en su sistema (consulte a su administrador de paquetes local). Luego solo necesita agregar soporte MUSL a su cadena de herramientas Rust y reconstruir ripgrep, lo que produce un ejecutable completamente estático:
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
La aplicación del indicador --features
desde arriba funciona como se esperaba. Si desea crear un ejecutable estático con MUSL y PCRE2, necesitará tener instalado musl-gcc
, que puede estar en un paquete separado de la biblioteca MUSL real, dependiendo de su distribución de Linux.
ripgrep está relativamente bien probado, incluidas pruebas unitarias y pruebas de integración. Para ejecutar el conjunto de pruebas completo, utilice:
$ cargo test --all
desde la raíz del repositorio.
rg --json
. Entonces, todo lo que necesitas hacer para que funcione es rg --json pattern | delta
. Consulte la sección del manual de delta sobre grep para obtener más detalles.Para informar una vulnerabilidad de seguridad, comuníquese con Andrew Gallant. La página de contacto tiene mi dirección de correo electrónico y mi clave pública PGP si desea enviar un mensaje cifrado.
La siguiente es una lista de traducciones conocidas de la documentación de ripgrep. Estos se mantienen de manera no oficial y es posible que no estén actualizados.