rga, chamado de ripgrep-all
, é uma excelente ferramenta que permite pesquisar quase todos os arquivos para um padrão de texto. Embora o comando OG grep esteja limitado a arquivos de texto simples, o rga
pode procurar texto em uma ampla gama de tipos de arquivos, como PDF, e-Books, documentos do Word, zip, tar e até legendas incorporadas.
O que é exatamente?
O comando grep
é usado para procurar padrões baseados em texto em arquivos. Na verdade, significa global regex pattern. Você pode não apenas procurar palavras simples, mas também pode especificar que a palavra deve ser a primeira palavra em uma linha, no final de uma linha, ou uma palavra específica deve vir antes dela. É por isso que o grep
é tão poderoso, porque usa regex (expressões regulares).
Há também uma limitação no grep
, mais ou menos. Você só pode usar grep
para procurar padrões em um arquivo de texto simples. Isso significa que você não pode procurar padrões em um documento PDF, em um arquivo compactado de tar/zip, nem em um banco de dados como o SQLite.
Agora imagine ter a pesquisa poderosa que o grep
oferece, mas para outros tipos de arquivos também. Aqui está o rga
, ou ripgrep-all
, como você pode chamá-lo.
É ripgrep
, mas com funcionalidade adicional.
Como instalar ripgrep-all
Os usuários do Arch Linux podem facilmente instalar ripgrep-all
usando o seguinte comando:
sudo pacman -S ripgrep-all
O gerenciador do pacotes Nix tem ripgrep-all
empacotado e para isso, use o seguinte comando:
nix-env -iA nixpkgs.ripgrep-all
Os usuários de macOS podem usar o gerenciador de pacotes homebrew assim:
brew install ripgrep-all
Usuários do Debian/Ubuntu
No momento, ripgrep-all
não está disponível nos repositórios de primeira parte do Debian nem nos repositórios do Ubuntu. Não se preocupe, isso não significa que seja impossível.
Em qualquer outro sistema operacional baseado no Debian (Ubuntu e seus derivados também), instale as dependências necessárias primeiro:
sudo apt-get install ripgrep pandoc poppler-utils ffmpeg
Uma vez instalados, visite esta página que contém o instalador. Encontre o arquivo que tem o sufixo "x86_64-unknown-linux-musl
". Baixe e extraia.
Esse arquivo tar contém dois arquivos binários executáveis necessários. São "rga
" e "rga-preproc
".
Copie-os para o diretório "~/.local/bin
". Na maioria dos casos, este diretório existirá, mas caso você não o tenha, crie-o usando o seguinte comando:
mkdir -p $HOME/.local/bin
Finalmente, adicione as seguintes linhas ao seu arquivo "~/.bashrc":
if ! [[ $PATH =~ "$HOME/.local/bin" ]]; then
PATH="$HOME/.local/bin:$PATH"
fi
Agora, feche e reabra o terminal para tornar as alterações feitas em "~/.bashrc
" eficazes. Com isso, ripgrep-all
está instalado.
Usando o ripgrep-all
ripgrep-all
é o nome do projeto, não o nome do comando, o nome de comando é rga
.
O utilitário rga suporta as seguintes extensões de arquivo:
- mídia:
.mkv
,.mp4
,.avi
- documentos:
.epub
,.odt
,.docx
,.fb2
,.ipynb
,.pdf
- arquivos comprimidos:
.zip
,.tar
,.tgz
,.tbz
,.tbz2
,.gz
,.bz2
,.xz
,.zst
- bancos de dados:
.db
,.db3
,.sqlite
,.sqlite3
- imagens (OCR):
.jpg
,.png
Você pode estar familiarizado com grep, mas vamos olhar para alguns exemplos, no entanto. Desta vez, com rga
em vez de grep.
Antes de avançar, por favor, dê uma olhada na hierarquia de diretórios abaixo:
.
├── teste_de_banco_de_dados.sqlite3
├── teste_de_arquivo_de_texto.odt
└── TLCL-19.01.pdf
Pesquisa com casos insensível e sensível
A correspondência de padrão mais simples é procurar uma palavra em um arquivo. Vamos tentar isso. Usaremos o comando rga
para realizar uma pesquisa sensível a casos para as palavras "red hat enterprise linux
" para todos os arquivos no diretório atual.
Enquanto o grep
tem sensibilidade de caso ligada por padrão, com rga
, a opção -s
precisa ser usada.
rga -s 'Mint'
Como você pode ver, com uma pesquisa sensível a casos, só temos o resultado de um arquivo de banco de dados sqlite3. Agora, vamos tentar uma pesquisa insensível usando a opção -i
e ver que resultados teremos.
rga -i 'Mint'
Ah, desta vez também temos uma correspondência do arquivo de banco de dados.
Correspondência inversa
Com grep
, e por extensão, com ripgrep-all
, você pode fazer uma correspondência inversa. O que significa: "Mostrar apenas linhas que NÃO têm esse padrão".
A opção para isso é -v
e que precisa estar presente imediatamente antes do padrão.
rga -v Mint *.sqlite3
Desta vez só selecionamos o arquivo de banco de dados, isso porque todos os outros arquivos têm um monte de linhas que não contêm a palavra 'Mint' neles.
Pesquisa contextual
Uma coisa bem interessante sobre a capacidade do rga
de pesquisar bancos de dados, em particular, é que ele pode não só procurar o seu match, mas também fornecer contexto relevante (quando solicitado). Embora a pesquisa em bancos de dados não seja especial, é sempre um momento "Oh uau, ele pode fazer isso?".
Uma pesquisa contextual é realizada usando as seguintes três opções:
-A
: mostrar contexto após a linha correspondente-B
: mostrar contexto antes da linha correspondente-C
: mostrar contexto antes e após a linha correspondente
Se isso parece confuso, não se preocupe. Vamos mostrar cada opção para ajudá-lo a entender melhor.
Usando a opção -C
Para mostrar do que estamos falando, vamos dar uma olhada no seguinte comando e sua saída. Este é um exemplo de usar a opção -C
.
rga -C 2 'Mint'
Como você pode ver, não só recebemos a correspondência do arquivo de banco de dados, mas também podemos ver as linhas que estão cronologicamente antes da correspondência e também linhas que estão após a correspondência. Isso não confundiu aleatoriamente as linhas, o que é muito bom porque não usamos as chaves para numerar cada linha.
Você deve estar se perguntando se algo está errado. Especificamos '2', mas só temos linha '1' depois. Bem, isso é porque não há linha depois da linha 'fedora linux' no banco de dados. :)
Usando a opção -A
Para entender melhor o uso da opção -A
, vamos dar uma olhada em um exemplo.
rga -A 2 Mint
Vemos que é uma letra de algum tipo... Nos faz pensar o que havia no corpo.
Usando a opção -B
Talvez esse documento está incompleto... Vamos obter um contexto das linhas que estão acima dele.
Para ver as linhas anteriores, precisamos usar a opção -B
.
rga -B 6 Mint
Como você pode ver, perguntamos "Mostre-me as 6 linhas que vêm antes da minha linha correspondente" e eu tenho isso na saída. Bastante útil para algumas situações, não acha?
Pesquisa multi-threaded
Como ripgrep-all
é um invólucro em torno do ripgrep
, você pode fazer uso de várias opções dele.
Uma dessas opções é multi-threading. Por padrão o ripgrep
escolhe a contagem de processadores com base na heurística. E assim, ripgrep-all
faz o mesmo também.
Isso não significa que você não pode especificá-los você mesmo! :)
A opção para fazê-lo é -j
. Use assim:
rga -j NUMERO-DE-THREADS
Não há um exemplo prático para mostrar isso de forma confiável, então vamos deixar isso para você mesmo ;)
Caching
Um dos principais pontos que chama atenção no rga
, além de suportar o grande número de extensões de arquivos, é que ele armazena dados eficientemente.
Como padrão, dependendo do SO, os seguintes diretórios armazenarão o cache gerado por rga:
- Linux:
~/.cache/rga
- macOS:
~/Library/Caches/rga
Primeiro executaremos o seguinte comando para remover o cache:
rm -rf ~/.cache/rga
Assim que o cache for limpo, executaremos uma consulta simples duas vezes. Esperamos ver uma melhora de desempenho na segunda vez.
time rga -i linux > /dev/null
Escolhemos deliberadamente o padrão 'linux' já que está ocorrendo muitas vezes no PDF do livro 'The Linux Command Line' e também no documento '.odt', bem como no arquivo de banco de dados. Para verificar a velocidade, não precisamos verificar a saída, de modo que é redirecionada para o arquivo '/dev/null'.
Vemos que a primeira vez que o comando executou, ele não tem um cache. Mas a segunda vez que executar o mesmo comando rende um processamento mais rápido.
No final, também pode ser usada a opção --rga-no-cache
, para desativar o uso do cache, mesmo que esteja presente. O resultado é semelhante ao primeiro comando rga
.
Conclusão
rga
é o Canivete Suíço de Grep. É uma ferramenta que pode ser usada para quase qualquer tipo de arquivo e se comporta de forma semelhante ao grep
, pelo menos com o regex, menos com as opções.
Mas no geral, rga
é uma das ferramentas que recomendamos que você use. Comente e compartilhe sua experiência/pensamentos!