ripgrep é uma ferramenta de pesquisa orientada a linhas que pesquisa recursivamente o diretório atual em busca de um padrão regex. Por padrão, o ripgrep respeitará as regras do gitignore e pulará automaticamente arquivos/diretórios ocultos e arquivos binários. (Para desativar toda a filtragem automática por padrão, use rg -uuu
.) ripgrep tem suporte de primeira classe no Windows, macOS e Linux, com downloads binários disponíveis para cada versão. ripgrep é semelhante a outras ferramentas de pesquisa populares como The Silver Searcher, ack e grep.
Licenciado duplamente pelo MIT ou UNLICENSE.
Por favor, consulte o CHANGELOG para um histórico de lançamento.
Este exemplo pesquisa em toda a árvore de origem do kernel Linux (depois de executar make defconfig && make -j8
) por [AZ]+_SUSPEND
, onde todas as correspondências devem ser palavras. Os tempos foram coletados em um sistema com Intel i9-12900K 5,2 GHz.
Lembre-se de que um único benchmark nunca é suficiente! Veja minha postagem no blog sobre ripgrep para uma comparação muito detalhada com mais benchmarks e análises.
Ferramenta | Comando | Contagem de linhas | Tempo |
---|---|---|---|
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) |
O Pesquisador de Prata | 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) |
Aqui está outro benchmark no mesmo corpus acima que desconsidera os arquivos gitignore e pesquisa com uma lista de permissões. O corpus é o mesmo do benchmark anterior, e os sinalizadores passados para cada comando garantem que eles estejam fazendo um trabalho equivalente:
Ferramenta | Comando | Contagem de linhas | Tempo |
---|---|---|---|
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) |
grep GNU | grep -E -r -n --include='*.c' --include='*.h' -w '[AZ]+_SUSPEND' | 447 | 0,674s (10,69x) |
Agora passaremos para a pesquisa em um único arquivo grande. Aqui está uma comparação direta entre ripgrep, ugrep e GNU grep em um arquivo armazenado em cache na memória (~ 13 GB, OpenSubtitles.raw.en.gz
, descompactado):
Ferramenta | Comando | Contagem de linhas | Tempo |
---|---|---|---|
ripgrep (Unicode) | rg -w 'Sherlock [AZ]w+' | 7882 | 1,042s (1,00x) |
ugrep | ugrep -w 'Sherlock [AZ]w+' | 7882 | 1,339s (1,28x) |
grep GNU (Unicode) | LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [AZ]w+' | 7882 | 6,577s (6,31x) |
No benchmark acima, passar o sinalizador -n
(para mostrar números de linha) aumenta os tempos para 1.664s
para ripgrep e 9.484s
para GNU grep. Os tempos ugrep não são afetados pela presença ou ausência de -n
.
Cuidado com os penhascos de desempenho:
Ferramenta | Comando | Contagem de linhas | Tempo |
---|---|---|---|
ripgrep (Unicode) | rg -w '[AZ]w+ Sherlock [AZ]w+' | 485 | 1,053s (1,00x) |
grep 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) |
E o desempenho pode cair vertiginosamente ao pesquisar padrões em arquivos grandes, sem nenhuma oportunidade de otimizações literais:
Ferramenta | Comando | Contagem de linhas | Tempo |
---|---|---|---|
ripgrep | rg '[A-Za-z]{30}' | 6749 | 15,569s (1,00x) |
ugrep | ugrep -E '[A-Za-z]{30}' | 6749 | 21,857s (1,40x) |
grep GNU | LC_ALL=C grep -E '[A-Za-z]{30}' | 6749 | 32,409s (2,08x) |
grep GNU (Unicode) | LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}' | 6795 | 8m30s (32,74x) |
Por fim, contagens altas de partidas também tendem a prejudicar o desempenho e suavizar as diferenças entre as ferramentas (porque o desempenho é dominado pela rapidez com que se consegue lidar com uma partida e não pelo algoritmo usado para detectar a partida, em geral):
Ferramenta | Comando | Contagem de linhas | Tempo |
---|---|---|---|
ripgrep | rg the | 83499915 | 6,948s (1,00x) |
ugrep | ugrep the | 83499915 | 11,721s (1,69x) |
grep GNU | LC_ALL=C grep the | 83499915 | 15,217s (2,19x) |
.gitignore
/ .ignore
/ .rgignore
, não pesquisará arquivos ocultos e não pesquisará arquivos binários. A filtragem automática pode ser desativada com rg -uuu
.rg -tpy foo
limita sua pesquisa a arquivos Python e rg -Tjs foo
exclui arquivos JavaScript de sua pesquisa. ripgrep pode aprender sobre novos tipos de arquivos com regras de correspondência personalizadas.grep
, como mostrar o contexto dos resultados da pesquisa, pesquisar vários padrões, destacar correspondências com cores e suporte completo a Unicode. Ao contrário do GNU grep, o ripgrep permanece rápido enquanto suporta Unicode (que está sempre ativado).-P/--pcre2
(use PCRE2 sempre) ou --auto-hybrid-regex
(use PCRE2 somente se necessário). Uma sintaxe alternativa é fornecida através da opção --engine (default|pcre2|auto)
.-E/--encoding
.)-z/--search-zip
.Em outras palavras, use ripgrep se você gosta de velocidade, filtragem por padrão, menos bugs e suporte Unicode.
Apesar de inicialmente não querer adicionar todos os recursos existentes ao ripgrep, com o tempo, o ripgrep aumentou o suporte para a maioria dos recursos encontrados em outras ferramentas de pesquisa de arquivos. Isso inclui a pesquisa de resultados abrangendo várias linhas e suporte opcional para PCRE2, que fornece suporte para pesquisa e referência retroativa.
Neste ponto, os principais motivos para não usar o ripgrep provavelmente consistem em um ou mais dos seguintes:
Geralmente, sim. Um grande número de benchmarks com análises detalhadas para cada um está disponível em meu blog.
Resumindo, o ripgrep é rápido porque:
-P/--pcre2
.).gitignore
usando um RegexSet
. Isso significa que um único caminho de arquivo pode ser comparado a vários padrões glob simultaneamente.crossbeam
e ignore
.Andy Lester, autor de ack, publicou uma excelente tabela comparando os recursos de ack, ag, git-grep, GNU grep e ripgrep: https://beyondgrep.com/feature-comparison/
Observe que o ripgrep desenvolveu recentemente alguns novos recursos significativos que ainda não estão presentes na tabela de Andy. Isso inclui, mas não está limitado a, arquivos de configuração, passthru, suporte para pesquisa de arquivos compactados, pesquisa multilinha e suporte opcional a regex sofisticado via PCRE2.
Se você quiser experimentar o ripgrep antes de instalar, há um playground não oficial e um tutorial interativo.
Se você tiver alguma dúvida sobre isso, abra um problema no repositório do tutorial.
O nome binário para ripgrep é rg
.
Arquivos de binários pré-compilados para ripgrep estão disponíveis para Windows, macOS e Linux. Os binários do Linux e do Windows são executáveis estáticos. Os usuários de plataformas não mencionadas explicitamente abaixo são aconselhados a baixar um desses arquivos.
Se você for um usuário macOS Homebrew ou Linuxbrew , poderá instalar o ripgrep a partir do homebrew-core:
$ brew install ripgrep
Se você é um usuário MacPorts , pode instalar o ripgrep a partir das portas oficiais:
$ sudo port install ripgrep
Se você é usuário do Windows Chocolatey , pode instalar o ripgrep do repositório oficial:
$ choco install ripgrep
Se você é usuário do Windows Scoop , pode instalar o ripgrep do bucket oficial:
$ scoop install ripgrep
Se você for um usuário do Windows Winget , poderá instalar o ripgrep do repositório winget-pkgs:
$ winget install BurntSushi.ripgrep.MSVC
Se você é um usuário do Arch Linux , pode instalar o ripgrep a partir dos repositórios oficiais:
$ sudo pacman -S ripgrep
Se você é usuário do Gentoo , pode instalar o ripgrep do repositório oficial:
$ sudo emerge sys-apps/ripgrep
Se você é usuário do Fedora , pode instalar o ripgrep dos repositórios oficiais.
$ sudo dnf install ripgrep
Se você é um usuário do openSUSE , o ripgrep está incluído no openSUSE Tumbleweed e no openSUSE Leap desde 15.1.
$ sudo zypper install ripgrep
Se você for um usuário RHEL/CentOS 7/8 , poderá instalar o ripgrep do 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
Se você é usuário do Nix , pode instalar o ripgrep do nixpkgs:
$ nix-env --install ripgrep
Se você é um usuário do Flox , pode instalar o ripgrep da seguinte maneira:
$ flox install ripgrep
Se você é usuário do Guix , pode instalar o ripgrep da coleção oficial de pacotes:
$ guix install ripgrep
Se você é um usuário Debian (ou usuário de um derivado do Debian como o Ubuntu ), então o ripgrep pode ser instalado usando um arquivo binário .deb
fornecido em cada versão do 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
Se você executa o Debian estável, o ripgrep é mantido oficialmente pelo Debian, embora sua versão possa ser mais antiga que o pacote deb
disponível na etapa anterior.
$ sudo apt-get install ripgrep
Se você é um usuário do Ubuntu Cosmic (18.10) (ou mais recente), o ripgrep está disponível usando o mesmo pacote do Debian:
$ sudo apt-get install ripgrep
(NB: Vários snaps para ripgrep no Ubuntu também estão disponíveis, mas nenhum deles parece funcionar corretamente e gera uma série de relatórios de bugs muito estranhos que não sei como consertar e não tenho tempo para consertar. Portanto, não é mais uma opção de instalação recomendada.)
Se você é um usuário ALT , pode instalar o ripgrep do repositório oficial:
$ sudo apt-get install ripgrep
Se você é um usuário do FreeBSD , você pode instalar o ripgrep a partir das portas oficiais:
$ sudo pkg install ripgrep
Se você é um usuário do OpenBSD , você pode instalar o ripgrep a partir das portas oficiais:
$ doas pkg_add ripgrep
Se você é um usuário NetBSD , então você pode instalar o ripgrep do pkgsrc:
$ sudo pkgin install ripgrep
Se você é um usuário do Haiku x86_64 , pode instalar o ripgrep a partir das portas oficiais:
$ sudo pkgman install ripgrep
Se você for um usuário do Haiku x86_gcc2 , poderá instalar o ripgrep da mesma porta do Haiku x86_64 usando a construção da arquitetura secundária x86:
$ sudo pkgman install ripgrep_x86
Se você é um usuário do Void Linux , pode instalar o ripgrep do repositório oficial:
$ sudo xbps-install -Syv ripgrep
Se você é um programador Rust , ripgrep pode ser instalado com cargo
.
strip
no binário. $ cargo install ripgrep
Alternativamente, pode-se usar cargo binstall
para instalar um binário ripgrep diretamente do GitHub:
$ cargo binstall ripgrep
ripgrep é escrito em Rust, então você precisará fazer uma instalação do Rust para compilá-lo. ripgrep compila com Rust 1.72.0 (estável) ou mais recente. Em geral, o ripgrep rastreia a versão estável mais recente do compilador Rust.
Para construir o ripgrep:
$ git clone https://github.com/BurntSushi/ripgrep
$ cd ripgrep
$ cargo build --release
$ ./target/release/rg --version
0.1.3
NOTA: No passado, ripgrep suportava um recurso simd-accel
Cargo ao usar um compilador Rust nightly. Isso beneficiou apenas a transcodificação UTF-16. Como exigia recursos instáveis, esse modo de construção estava sujeito a falhas. Por causa disso, o suporte para ele foi removido. Se quiser otimizações SIMD para transcodificação UTF-16, você terá que solicitar ao projeto encoding_rs
para usar APIs estáveis.
Finalmente, o suporte PCRE2 opcional pode ser construído com ripgrep ativando o recurso pcre2
:
$ cargo build --release --features 'pcre2'
A ativação do recurso PCRE2 funciona com um compilador Rust estável e tentará localizar e vincular automaticamente a biblioteca PCRE2 do seu sistema via pkg-config
. Se não existir, o ripgrep criará o PCRE2 a partir do código-fonte usando o compilador C do seu sistema e, em seguida, vinculará-o estaticamente ao executável final. A vinculação estática pode ser forçada mesmo quando há uma biblioteca de sistema PCRE2 disponível, construindo ripgrep com o destino MUSL ou configurando PCRE2_SYS_STATIC=1
.
ripgrep pode ser construído com o alvo MUSL no Linux instalando primeiro a biblioteca MUSL em seu sistema (consulte o gerenciador de pacotes da sua vizinhança). Então você só precisa adicionar suporte MUSL ao seu conjunto de ferramentas Rust e reconstruir o ripgrep, que produz um executável totalmente estático:
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target x86_64-unknown-linux-musl
Aplicar o sinalizador --features
acima funciona conforme o esperado. Se você deseja construir um executável estático com MUSL e com PCRE2, então você precisará ter musl-gcc
instalado, que pode estar em um pacote separado da biblioteca MUSL real, dependendo da sua distribuição Linux.
ripgrep é relativamente bem testado, incluindo testes unitários e testes de integração. Para executar o conjunto de testes completo, use:
$ cargo test --all
da raiz do repositório.
rg --json
. Então, tudo que você precisa fazer para que funcione é rg --json pattern | delta
. Consulte a seção do manual do delta sobre grep para obter mais detalhes.Para relatar uma vulnerabilidade de segurança, entre em contato com Andrew Gallant. A página de contato contém meu endereço de e-mail e chave pública PGP caso você queira enviar uma mensagem criptografada.
A seguir está uma lista de traduções conhecidas da documentação do ripgrep. Eles são mantidos não oficialmente e podem não estar atualizados.