ripgrep-all: o grep para todos

ripgrep-all: o grep para todos

O ripgrep-all é grep em esteroides. Além de pesquisar em arquivos de texto, ele também pode pesquisar em PDFs, documentos do Word, E-Books, Zip, arquivos Tar e muito mais.

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:

Comandos para usar no terminal

sudo pacman -S ripgrep-all

O gerenciador do pacotes Nix tem ripgrep-all empacotado e para isso, use o seguinte comando:

Comandos para usar no terminal

nix-env -iA nixpkgs.ripgrep-all

Os usuários de macOS podem usar o gerenciador de pacotes homebrew assim:

Comandos para usar no terminal

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:

Comandos para usar no terminal

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:

Comandos para usar no terminal

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.

Comandos para usar no terminal

rga -s 'Mint'

rga_1

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.

Comandos para usar no terminal

rga -i 'Mint'

rga_2

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.

Comandos para usar no terminal

rga -v Mint *.sqlite3

rga_3

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.

Comandos para usar no terminal

rga -C 2 'Mint'

rga_4

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.

Comandos para usar no terminal

rga -A 2 Mint

rga_5

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.

Comandos para usar no terminal

rga -B 6 Mint

rga_6

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:

Comandos para usar no terminal

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:

Comandos para usar no terminal

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.

Comandos para usar no terminal

time rga -i linux > /dev/null

rga_7

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!

Última atualização deste artigo: 7 de november de 2022