O que é GREP no Linux e como usá-lo

Uma fotografia de uma pessoa trabalhando em seu laptop.

Grep é um pequeno programa UNIX para encontrar padrões correspondentes. Lançado pela primeira vez no V6 UNIX, agora você pode encontrá-lo em quase qualquer sistema semelhante ao UNIX, como Linux, macOS e até BSDs. Neste artigo, irei abordar o básico do Grep e mostrar alguns exemplos de como usar o programa em tarefas diárias.

O básico sobre como usar o Grep

No seu núcleo, o Grep é um programa simples e direto. Ele recebe uma entrada, encontra o texto que você deseja nessa entrada e imprime as correspondências como saída. O Grep pode processar quase qualquer fonte de texto simples. Isso permite que ele leia entradas de outros comandos e procure diretamente em arquivos.

A maneira mais simples de começar com o Grep é lendo dados de um arquivo de texto. Por exemplo, o seguinte comando imprime o conteúdo do meu arquivo sample.txt:

grep'' sample.txt

Além disso, você pode usar esse recurso para pesquisar e encontrar trechos específicos de texto dentro de seus arquivos de texto:

grep'word' sample.txt

Um terminal mostrando o recurso simples de correspondência de palavras do Grep.

Você também pode usar o Grep com pipes do UNIX, permitindo que você junte vários programas em um único comando:

cat sample.txt |grep''

Um terminal mostrando o Grep imprimindo o arquivo inteiro ao ser executado sem argumentos.

Bom saber: quer expandir seu conhecimento em UNIX? Aprenda como funcionam os paginadores no Linux verificando nossa folha de dicas para o GNU less.

Encontrando arquivos em um diretório

Uma das tarefas mais fáceis que você pode realizar com o Grep é encontrar arquivos em uma listagem de diretórios. Para isso, você pode enviar a saída do comando ls através de um pipe do UNIX diretamente para o Grep.

O seguinte comando imprimirá e destacará todos os arquivos na sua pasta Downloads com a extensão de arquivo .jpg:

ls ~/Downloads |grep \\.jpg

Um terminal mostrando o Grep filtrando listas de arquivos com base na extensão do arquivo.

Você também pode enviar uma saída de ls mais elaborada para o Grep e usar isso para correspondência de padrões. Por exemplo, o seguinte lista todos os arquivos no diretório com menos de 1MB de tamanho:

ls-lh ./|grep .K

Ignorando o Case

Por padrão, quase todos os programas em um sistema semelhante ao UNIX são sensíveis a maiúsculas e minúsculas. Isso significa que o sistema trata a string “Hello” de forma diferente de “hello”, “hEllo” e “helLo”.

Um terminal mostrando o comportamento padrão sensível a maiúsculas do Grep.

Esse comportamento pode ser problemático ao procurar strings dentro de arquivos. Por exemplo, um ensaio pode conter tanto “Hello” quanto “hello” ao mesmo tempo. Para resolver isso, execute o Grep com a flag -i seguida da string que você deseja encontrar.

grep-i Hello hello.txt

Um terminal mostrando a flag -i desativando a sensibilidade a maiúsculas do Grep.

Pesquisas Recursivas

O Grep pode pesquisar em mais de um arquivo ou diretório ao mesmo tempo. Isso é útil se você está trabalhando em um projeto com vários arquivos e deseja saber onde uma string de texto aparece em um diretório. Por exemplo, o seguinte comando encontra a palavra “MakeTechEasier” dentro do diretório “sample”:

grep-r'MakeTechEasier' ./sample

Dito isso, usar a flag -r também fará com que o Grep procure em todos os arquivos do diretório alvo. Isso pode ser um problema se você também tiver arquivos não-texto dentro da pasta que está pesquisando. Para evitar isso, execute o Grep com a flag -I:

grep-rI'MakeTechEasier' ./sample

A propósito: aprenda como criar arquivos no terminal usando o comando touch.

Correspondendo Arquivos que Contêm a String

Além de mostrar onde uma string específica ocorre em diferentes arquivos, você também pode usar o Grep para criar uma lista de arquivos que contêm seu texto alvo. Isso é útil se você deseja saber se um arquivo contém uma determinada string, mas não quer que o Grep imprima cada instância dela no terminal.

Para fazer isso, execute o Grep com as flags -r e -l seguidas da string que deseja corresponder e do diretório que deseja examinar:

grep-rl MakeTechEasier ./sample

Você pode até mesmo enclausurar seu comando Grep dentro de um subshell Bash para criar múltiplas condições para sua correspondência de texto. Por exemplo, a seguinte linha de código retornará apenas arquivos que contêm tanto “Hello” quanto “MakeTechEasier” na pasta “sample”:

grep-rl MakeTechEasier $(grep-rl Hello ./sample)

Encontrando o Oposto

Além de fazer buscas diretas, o Grep também pode retornar os resultados que não correspondem aos seus critérios iniciais. Embora isso possa parecer contra-intuitivo à primeira vista, pode ser útil em casos onde você precisa destacar erros e anomalias da sua entrada de texto.

Para fazer isso, execute o Grep com -v juntamente com as outras flags que deseja ativar. Por exemplo, o seguinte comando buscará recursivamente em todos os arquivos da minha pasta “/etc/nginx” e retornará todas as linhas que não contêm a string “nginx”:

grep-rv'nginx'/etc/nginx

Um terminal mostrando a flag invertida do Grep que corresponde a tudo, exceto a string alvo.

Palavras e Linhas

Pode ser útil também dizer ao Grep para procurar por palavras ou linhas completas, ao invés de qualquer coisa que contenha um determinado padrão. Isso é útil se você está correspondendo uma string de caracteres que é comum em muitas palavras. Por exemplo, corresponder a palavra “it” retornará muitos falsos positivos, já que “it” é uma string comum que você pode encontrar em palavras.

Para corrigir isso, você pode executar o Grep com a flag -w seguida da palavra que deseja corresponder:

cat it.txt |grep-w it

Um terminal mostrando a flag de correspondência de palavras inteiras do Grep.

Em vez de imprimir todas as palavras que contêm o padrão, o Grep imprimirá apenas a palavra por si só. Ele faz a mesma coisa para linhas inteiras com a flag -x, então se você está procurando uma frase ou uma única linha em um arquivo de configuração, isso pode realmente ajudar.

Adicionando Números de Linha à Saída do Grep

Os números de linha são uma parte importante na depuração de programas e na revisão de textos. Eles permitem que você faça referência com precisão à localização de uma função ou frase específica, tornando muito mais rápido corrigir e alterar.

Nesse sentido, o Grep vem com a capacidade de imprimir números de linha em sua saída padrão. Para fazer isso, execute o programa com a flag -n seguida da string que você deseja corresponder:

grep-n main ./my-code.c

Com a ajuda dos pipes do UNIX, você também pode modificar a saída do Grep e imprimir apenas os números de linha do que você está procurando. Isso torna a saída muito mais limpa e mais fácil de analisar textos grandes:

grep-n Sed essay.txt |cut-f1-d :

FYI: os pipes do UNIX são mais do que apenas uma ferramenta para o Grep. Aprenda como automatizar suas tarefas de shell remoto criando e usando pipes SSH.

Usando Regex Estendido com o Grep

O Grep usa o conjunto de metacaracteres de Expressão Regular Básica (BRE) para corresponder e filtrar strings de texto. Embora isso geralmente funcione para a maioria das tarefas, alguns usuários podem achar limitante, especialmente ao trabalhar com grupos de padrões.

Para resolver isso, a maioria das implementações do Grep fornece a flag -E, que permite que o programa interprete os metacaracteres de Expressão Regular Estendida (ERE). Por exemplo, o seguinte comando só funcionará com a flag -E:

printf"hello\nhellooooo\n"|grep-E .*o{2}$

Nota: a versão GNU do Grep usa algumas funcionalidades de ERE por padrão. No entanto, é uma boa prática usar -E sempre que você usar ERE para preservar a compatibilidade com outros sistemas semelhantes ao UNIX.

Além disso, o Grep também possui um modo especial que remove todas as funções de Regex. Para usar isso, execute o programa com a flag -F seguida da sua string simples:

grep-F[MakeTechEasier] ./fixed.txt

Adicionando Linhas Adjacentes à Saída do Grep

Uma das principais forças do Grep é mostrar onde o texto aparece no seu arquivo ou fluxo de entrada. No entanto, há instâncias onde saber apenas a localização exata de uma string não ajuda ao solucionar problemas. Por exemplo, um log de falhas geralmente fornece contexto adicional antes de imprimir a tradicional mensagem “Falha de Segmentação”.

Uma maneira de resolver esse problema é executar o Grep com a flag -C seguida da quantidade de linhas que você deseja imprimir ao redor do seu texto alvo. O seguinte comando imprime cinco linhas antes e depois da sua correspondência de texto:

grep-C5'Hello' ./hello-sample.txt

Um terminal mostrando a capacidade do Grep de imprimir o contexto ao redor de uma string alvo.

Você também pode personalizar se o Grep imprimir apenas os contextos anteriores ou posteriores à correspondência com as flags -B e -A. Por exemplo, o seguinte comando imprimirá as dez linhas anteriores após sua string alvo:

grep-A10'Hello' ./hello-sample.txt

Um terminal mostrando o Grep imprimindo as próximas 10 linhas após sua correspondência inicial de string.

Com o básico do Grep e como usá-lo em suas tarefas diárias em mente, você agora pode dar seu primeiro passo para entender a linha de comando e as principais utilidades do UNIX. Explore mais desse mundo muito diversificado e profundo aprendendo como o sed funciona no Linux.

Créditos da imagem: Alejandro Escamilla via Unsplash. Todas as alterações e capturas de tela por Ramces Red.