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

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.txtAlé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
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''
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
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 .KIgnorando 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”.

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
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' ./sampleDito 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' ./sampleA 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 ./sampleVocê 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
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
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.cCom 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.txtAdicionando 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
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
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.