ripgrep es una herramienta de búsqueda orientada a líneas que busca recursivamente en su actual
directorio un patron de expresiones regulares. De forma predeterminada, ripgrep respetará su .gitignore
y omitira automáticamente archivos ocultos,directorios ocultos y archivos binarios. ripgrep
tiene soporte para Windows, macOS y Linux, con opciones de descargas binarias disponibles
para todas las versiones.
ripgrep es similar a otras herramientas de búsqueda populares como The Silver Searcher, ack y grep.
Doblemente licensiado bajo MIT o UNLICENSE.
Porfavor revisa CHANGELOG para informarte sobre el historial de versiones.
- Instalación
- Guía de uso
- FAQ
- Regex syntax
- Archivos de configuración
- Shell completions
- Building
- Tranducciones
Este ejemplo busca en todo el
Árbol de fuentes del kernel de Linux
(después de ejecutar make defconfig && make -j8) para [A-Z] + _ SUSPEND, donde
todas las coincidencias deben ser palabras. Los tiempos se recopilaron en un sistema con Intel
i7-6900K 3,2 GHz.
¡Recuerde que un solo punto de referencia nunca es suficiente! Mira mi entrada de blog sobre ripgrep para una comparación muy detallada con más evaluaciones comparativas y análisis.
| Tool | Comando | Cantidad de Lineas | Tiempo |
|---|---|---|---|
| ripgrep (Unicode) | rg -n -w '[A-Z]+_SUSPEND' |
452 | 0.136s |
| git grep | git grep -P -n -w '[A-Z]+_SUSPEND' |
452 | 0.348s |
| ugrep (Unicode) | ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND' |
452 | 0.506s |
| The Silver Searcher | ag -w '[A-Z]+_SUSPEND' |
452 | 0.654s |
| git grep | LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND' |
452 | 1.150s |
| ack | ack -w '[A-Z]+_SUSPEND' |
452 | 4.054s |
| git grep (Unicode) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND' |
452 | 4.205s |
Aquí hay otro punto de referencia en el mismo corpus que el anterior que ignora gitignore archivos y búsquedas con una lista blanca en su lugar. El corpus es el mismo que en el benchmark anterior, y las banderas pasadas a cada comando aseguran que son haciendo un trabajo equivalente:
| Tool | Comando | Cantidad de Lineas | Tiempo |
|---|---|---|---|
| ripgrep | rg -uuu -tc -n -w '[A-Z]+_SUSPEND' |
388 | 0.096s |
| ugrep | ugrep -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND' |
388 | 0.493s |
| GNU grep | egrep -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND' |
388 | 0.806s |
Y finalmente, una comparación directa entre ripgrep, ugrep y GNU grep en un
único archivo grande almacenado en la memoria caché.
(~13GB, OpenSubtitles.raw.en.gz):
| Tool | Comando | Cantidad de Lineas | Tiempo |
|---|---|---|---|
| ripgrep | rg -w 'Sherlock [A-Z]\w+' |
7882 | 2.769s |
| ugrep | ugrep -w 'Sherlock [A-Z]\w+' |
7882 | 6.802s |
| GNU grep | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [A-Z]\w+' |
7882 | 9.027s |
En el punto de referencia anterior, se utiliza la bandera -n (para mostrar los números de línea)
y esto aumenta los tiempos a 3.423s para ripgrep y 13.031s para GNU grep.En ugrep
los tiempos no se ven afectados por la presencia o ausencia de "-n".
- Puede reemplazar muchos casos de uso servidos por otras herramientas de búsqueda porque contiene la mayoría de sus funciones y generalmente es más rápido.(Ver las preguntas frecuentes para obtener más detalles sobre si ripgrep realmente puede reemplace grep.)
- Al igual que otras herramientas especializadas para la búsqueda de código, ripgrep se establece de forma predeterminada en recursivo
búsqueda de directorio y no buscará archivos ignorados por su
Archivos
.gitignore/.ignore/.rgignore. También ignora ocultos y binarios archivos de forma predeterminada. ripgrep también implementa soporte completo para.gitignore, Considerando que hay muchos errores relacionados con esa funcionalidad en otro código herramientas de búsqueda que afirman ofrecer la misma funcionalidad. - ripgrep puede buscar tipos específicos de archivos. Por ejemplo,
rg -tpy foolimita su búsqueda a archivos Python yrg -Tjs fooexcluye JavaScript archivos de su búsqueda. ripgrep puede aprender sobre nuevos tipos de archivos con reglas de coincidencia personalizadas. - ripgrep admite muchas características que se encuentran en
grep, como mostrar el contexto de 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 mientras compatible con Unicode (que siempre está activado). - ripgrep tiene soporte opcional para cambiar su motor de expresiones regulares para usar PCRE2.
Entre otras cosas, esto hace que sea posible utilizar la vista alrededor y
backreferences en sus patrones, que no son compatibles con la configuración predeterminada de ripgrep
motor de expresiones regulares. La compatibilidad con PCRE2 se puede habilitar con
-P / - pcre2(use PCRE2 always) o--auto-hybrid-regex(use PCRE2 solo si es necesario). Una alternativa La sintaxis se proporciona a través de la opción--engine (default | pcre2 | auto-hybrid). - ripgrep admite la búsqueda de archivos en codificaciones de texto distintas de UTF-8, como
como UTF-16, latin-1, GBK, EUC-JP, Shift_JIS y más. (Algún apoyo para
Se proporciona la detección automática de UTF-16. Otras codificaciones de texto deben ser
específicamente especificado con la marca
-E / - encoding.) - ripgrep admite la búsqueda de archivos comprimidos en un formato común (brotli,
bzip2, gzip, lz4, lzma, xz o zstandard) con el indicador
-z / - search-zip. - soportes ripgrep [filtros de preprocesamiento de entrada arbitrarios] (preprocesador GUIDE.md #) que podría ser extracción de texto PDF, descompresión menos compatible, descifrado, detección automática de codificación y así sucesivamente. En otras palabras, use ripgrep si le gusta la velocidad, filtrando por defecto, menos errores y soporte Unicode.
A pesar de que inicialmente no quería agregar todas las funciones bajo el sol para ripgrep, con el tiempo, ripgrep ha aumentado la compatibilidad con la mayoría de las funciones que se encuentran en otros archivos herramientas de búsqueda. Esto incluye la búsqueda de resultados que abarquen múltiples líneas y soporte opcional para PCRE2, que proporciona soporte de referencia inversa.
En este punto, las razones principales para no usar ripgrep probablemente consisten en una o más de los siguientes:
- Necesita una herramienta portátil y ubicua. Si bien ripgrep funciona en Windows, macOS y Linux, no es omnipresente y no se ajusta a ninguna estándar como POSIX. La mejor herramienta para este trabajo es el viejo grep.
- Todavía existe alguna otra característica (o error) que no figura en este archivo README que confía en que está en otra herramienta que no está en ripgrep.
- Hay un caso de borde de rendimiento en el que ripgrep no funciona bien donde otro la herramienta funciona bien. (¡Envíe un informe de error!)
- ripgrep no se puede instalar en su máquina o no está disponible para su plataforma. (¡Envíe un informe de error!)
Generalmente sí. Una gran cantidad de puntos de referencia con análisis detallado para cada uno estan disponibles en mi blog.
Resumiendo, ripgrep es rápido porque:
- Está construido sobre el
Motor de expresiones regulares de Rust.
El cual utiliza autómatas finitos, SIMD y literal agresivo,estas optimizaciones hacen
que la búsqueda sea muy rápida. (Se puede optar por el soporte de PCRE2
con el indicador
-P / - pcre2.) - La biblioteca de expresiones regulares de Rust mantiene el rendimiento con soporte Unicode completo al construyendo decodificación UTF-8 directamente en su autómata finito determinista motor.
- Admite la búsqueda con mapas de memoria o mediante la búsqueda incremental con un tampón intermedio. El primero es mejor para archivos individuales y el Este último es mejor para directorios grandes. ripgrep elige la mejor búsqueda estrategia para usted automáticamente.
- Aplica sus patrones de ignorar en archivos
.gitignoreusando un [RegexSet] (https://docs.rs/regex/1/regex/struct.RegexSet.html). Eso significa que una única ruta de archivo se puede comparar con múltiples patrones globales. simultaneamente. - Utiliza un iterador de directorio recursivo paralelo sin bloqueo, cortesía de
[
crossbeam] (https://docs.rs/crossbeam) y [ignore] (https://docs.rs/ignore).
Andy Lester, autor de [ack] (https://beyondgrep.com), 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 algunas características nuevas importantes recientemente que aún no están presentes en el articulo de Andy. Esto incluye, entre otros, archivos de configuración, passthru, soporte para buscar archivos comprimidos, Búsqueda multilínea y compatibilidad con expresiones regulares elegantes mediante PCRE2.
El nombre binario de ripgrep es rg.
Los archivos de archivos binarios precompilados para ripgrep están disponibles para Windows, macOS y Linux. Se recomienda a los usuarios de otras plataformas que no son mencionadas aquí, que descarguen uno de estos binarios precompilados.
Los binarios de Linux son ejecutables estáticos. Los binarios de Windows están disponibles como construidos con MinGW (GNU) o con Microsoft Visual C ++ (MSVC). Cuando sea posible, use MSVC antes que GNU, pero deberá tener el [Microsoft VC ++ 2015 redistribuible] (https://www.microsoft.com/en-us/download/details.aspx?id=48145) instalado.
Si es un usuario de macOS Homebrew o de Linuxbrew, puede instalar ripgrep de homebrew-core:
$ brew install ripgrep
Si es un usuario de MacPorts, puede instalar ripgrep desde el puerto oficial:
$ sudo port install ripgrep
Si es un usuario de Windows Chocolatey, puede instalar ripgrep desde official repo:
$ choco install ripgrep
Si es un usuario de ** Windows Scoop **, puede instalar ripgrep desde el bucket oficial:
$ scoop install ripgrep
Si eres un usuario de Arch Linux, puedes instalar ripgrep desde los repositorios oficiales:
$ pacman -S ripgrep
Si es un usuario de Gentoo, puede instalar ripgrep desde el repositorio oficial:
$ emerge sys-apps/ripgrep
Si es un usuario de Fedora, puede instalar ripgrep desde repositorios.
$ sudo dnf install ripgrep
Si eres un usuario de openSUSE, ripgrep está incluido en openSUSE Tumbleweed y openSUSE Leap desde 15.1.
$ sudo zypper install ripgrep
Si es un usuario de RHEL/CentOS 7/8, puede instalar ripgrep desde copr:
$ 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 es un usuario de ** Nix **, puede instalar ripgrep desde nixpkgs:
$ nix-env --install ripgrep
$ # (O usando el nombre del atributo, el cual también es ripgrep).
Si es un usuario de Debian (o un usuario de un derivado de Debian como Ubuntu),
ripgrep se puede instalar usando un archivo binario .deb provisto en cada
[lanzamiento de ripgrep] (https://github.com/BurntSushi/ripgrep/releases).
$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/12.1.1/ripgrep_12.1.1_amd64.deb
$ sudo dpkg -i ripgrep_12.1.1_amd64.deb
Si ejecuta Debian Buster (actualmente Debian estable) o Debian sid, ripgrep es mantenido oficialmente por Debian.
$ sudo apt-get install ripgrep
Si es un usuario de Ubuntu Cosmic (18.10) (o más reciente), ripgrep esta [disponible] (https://launchpad.net/ubuntu/+source/rust-ripgrep) usando el mismo empaquetado como Debian:
$ sudo apt-get install ripgrep
(N.B. También están disponibles varias snaps para ripgrep en Ubuntu, pero ninguna de ellas parece funcionar bien y generan una serie de informes de errores muy extraños que no sé cómo solucionarlo y no tengo tiempo para solucionarlo. Por lo tanto, no es ya es una opción de instalación recomendada).
Si es un usuario de FreeBSD, puede instalar ripgrep desde el puerto oficial:
# pkg install ripgrep
Si es un usuario de OpenBSD, puede instalar ripgrep desde el puerto oficial:
$ doas pkg_add ripgrep
Si es un usuario de NetBSD, puede instalar ripgrep desde [pkgsrc] (https://pkgsrc.se/textproc/ripgrep):
# pkgin install ripgrep
Si es un usuario de Haiku x86_64, puede instalar ripgrep desde el puerto oficial:
$ 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:
$ pkgman install ripgrep_x86
Si eres un programas en Rust, ripgrep se puede instalar con cargo.
- Tenga en cuenta que la versión mínima admitida de Rust para ripgrep es 1.34.0, aunque ripgrep puede funcionar con versiones anteriores.
- Tenga en cuenta que el binario puede ser más grande de lo esperado porque contiene depuración
símbolos. Esto es intencional. Para eliminar los símbolos de depuración y, por lo tanto, reducir
el tamaño del archivo, ejecute
stripen el binario.
$ cargo install ripgrep
ripgrep está escrito en Rust, por lo que deberá obtener un Instalación de Rust para compilarlo. ripgrep se compila con Rust 1.34.0 (estable) o más reciente.
Para hacerle un build a ripgrep:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
Si tiene un compilador nocturno de Rust y una CPU Intel reciente, puede habilitar aceleración SIMD opcional adicional como tal
RUSTFLAGS="-C target-cpu=native" cargo build --release --features 'simd-accel'
La función simd-accel habilita la compatibilidad con SIMD en ciertas dependencias de ripgrep
(responsable de la transcodificación). No son necesarios para obtener optimizaciones SIMD
para buscar; esos se habilitan automáticamente. Con suerte, algún día,
la función simd-accel se volverá igualmente innecesaria. ADVERTENCIA: Actualmente,
la habilitación de esta opción puede aumentar drásticamente los tiempos de compilación.
Finalmente, el soporte opcional PCRE2 se puede construir con ripgrep habilitando el
Característica pcre2:
$ cargo build --release --features 'pcre2'
(TIP: use --features 'pcre2 simd-accel' para incluir también el tiempo de compilación SIMD
optimizaciones, que solo funcionarán con el compilador en su ultima versión).
Habilitando la función PCRE2 funciona con un compilador estable de Rust y
intente encontrar y vincular automáticamente con la biblioteca PCRE2 de su sistema a través de
pkg-config. Si no existe, ripgrep construirá PCRE2 desde la fuente
utilizando el compilador de C de su sistema y luego vincularlo estáticamente al final
ejecutable. La vinculación estática se puede forzar incluso cuando hay un PCRE2 disponible
biblioteca del sistema construyendo ripgrep con el objetivo MUSL o estableciendo
PCRE2_SYS_STATIC = 1.
ripgrep se puede construir con el objetivo MUSL en Linux instalando primero la biblioteca de MUSL en su sistema (consulte al administrador de paquetes de su distribución). Entonces solo necesita agregar soporte MUSL a su cadena de herramientas Rust y reconstruir ripgrep, que produce un ejecutable completamente estático:
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
Aplicando la bandera --features de arriba funciona como se esperaba. Si quieres
construir un ejecutable estático con MUSL y con PCRE2, entonces necesitará tener
musl-gcc instalado, que puede estar en un paquete separado del actual
Biblioteca MUSL, dependiendo de su distribución de Linux.
ripgrep está relativamente bien probado, incluidas tanto las pruebas unitarias como la integración pruebas. Para ejecutar el conjunto de pruebas completo, use:
$ cargo test --all
from the repository root.
La siguiente es una lista de traducciones conocidas de la documentación de ripgrep. Estas se mantienen extraoficialmente y pueden no estar actualizados.
