Como usá-los efetivamente?

Se você usa Linux há algum tempo, já conhece o grep — Global Regular Expression Print, uma ferramenta de processamento de texto que pode ser usada para pesquisar arquivos e diretórios. É muito útil nas mãos de um usuário avançado do Linux. No entanto, usá-lo sem regex pode limitar seus recursos.

Mas o que é Regex?

Regex são expressões regulares que você pode usar para melhorar a funcionalidade de pesquisa grep. Regex, por definição, é um padrão avançado de filtragem de saída. Com a prática, você pode usar o regex de forma eficaz, pois também pode usá-lo com outros comandos do Linux.

Em nosso tutorial, aprenderemos como usar Grep e Regex de forma eficaz.

Pré-requisito

O uso do grep com regex requer um bom conhecimento do Linux. Se você é iniciante, confira nossos guias do Linux.

Você também precisa de acesso a um laptop ou computador executando o sistema operacional Linux. Você pode usar qualquer distribuição Linux de sua escolha. E, se você tiver uma máquina Windows, ainda poderá usar o Linux com WSL2. Confira nossa visão detalhada sobre isso aqui.

O acesso à linha de comando/terminal permite que você execute todos os comandos fornecidos em nosso tutorial grep/regex.

Além disso, você também precisa acessar um ou mais arquivos de texto necessários para executar os exemplos. Usei o ChatGPT para gerar uma parede de texto, dizendo para escrever sobre tecnologia. O prompt que usei é o seguinte.

“Gere 400 palavras sobre tecnologia. Deve incluir a maior parte da tecnologia. Além disso, certifique-se de repetir os nomes das tecnologias no texto.”

Assim que gerou o texto, copiei e colei e salvei no arquivo tech.txt, que usaremos ao longo do tutorial.

Por fim, um entendimento básico do comando grep é obrigatório. Você pode conferir 16 exemplos de comandos grep para atualizar seu conhecimento. Também apresentaremos brevemente o comando grep para você começar.

Sintaxe e exemplos do comando grep

A sintaxe do comando grep é simples.

$ grep -options [regex/pattern] [files]

Como você pode perceber, ele espera um padrão e a lista de arquivos que você deseja executar o comando.

Existem muitas opções grep disponíveis que modificam sua funcionalidade. Esses incluem:

  • – i: ignorar casos
  • -r: faz busca recursiva
  • -w: realiza uma pesquisa para encontrar apenas palavras inteiras
  • -v: exibe todas as linhas não correspondentes
  • -n: exibe todos os números de linha correspondentes
  • -l: imprime os nomes dos arquivos
  • –color: saída de resultado colorido
  • -c: mostra a contagem de correspondências para o padrão usado
  11 melhores fechaduras inteligentes para melhor segurança doméstica

#1. Pesquisar uma palavra inteira

Você precisará usar o argumento -w com grep para uma pesquisa de palavras inteiras. Ao usá-lo, você ignora quaisquer strings que correspondam ao padrão fornecido.

$ grep -w ‘tech\|5G’ tech.txt

Como você pode ver, o comando resulta em uma saída onde procura duas palavras, “5G” e “tech”, ao longo do texto. Em seguida, marca-os com a cor vermelha.

Aqui, o | o símbolo de pipe é escapado para que o grep não o processe como um metacaractere.

Para fazer uma pesquisa que não diferencia maiúsculas de minúsculas, use grep com o argumento -i.

$ grep -i ‘tech’ tech.txt

O comando procura por qualquer instância que não diferencie maiúsculas de minúsculas da string “tech”, seja uma palavra completa ou parte dela.

Para exibir todas as linhas que não contêm um determinado padrão, você precisará usar o argumento -v.

$ grep -v ‘tech’ tech.txt

A saída mostra todas as linhas que não contêm a palavra “tech”. Além disso, você verá linhas vazias também. Essas linhas são as linhas que estão depois de um parágrafo.

Para fazer uma pesquisa recursiva, use o argumento -r com grep.

$ grep -R ‘error\|warning’ /var/log/*.log
#output

/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: ignoring pre-dependency problem!

O comando grep procura recursivamente por duas palavras, “error” e “warning”, no diretório /var/log. Este é um comando útil para aprender sobre quaisquer avisos e erros nos arquivos de log.

Grep e Regex: o que é e exemplos

Como estamos trabalhando com regex, você precisa saber que regex oferece três opções de sintaxe. Esses incluem:

  • Expressões Regulares Básicas (BRE)
  • Expressões Regulares Estendidas (ERE)
  • Expressões regulares compatíveis com Pearl (PCRE)

O comando grep usa BRE como opção padrão. Portanto, se você quiser usar outros modos regex, precisará mencioná-los. O comando grep também trata os metacaracteres como eles são. Portanto, se você usar metacaracteres como ?, +, ), precisará escapá-los com o comando de barra invertida (\).

A sintaxe do grep com regex é a seguinte.

$ grep [regex] [filenames]

Vamos ver grep e regex em ação com os exemplos abaixo.

#1. Correspondências de palavras literais

Para fazer uma correspondência de palavra literal, você precisará fornecer uma string como regex. Afinal, uma palavra também é um regex.

$ grep "technologies" tech.txt

Da mesma forma, você também pode usar correspondências literais para encontrar usuários atuais. Para isso, corra,

$ grep bash /etc/passwd
#output

root:x:0:0:root:/root:/bin/bash

nitt:x:1000:1000:,,,:/home/nitt:/bin/bash

Isso exibe os usuários que podem acessar o bash.

  7 melhores ferramentas de rastreamento de humor para melhorar sua qualidade de vida

#2. Correspondência de âncora

A correspondência de âncora é uma técnica útil para pesquisas avançadas usando caracteres especiais. No regex, existem diferentes caracteres âncora que você pode usar para representar posições específicas em um texto. Esses incluem:

  • Símbolo de circunflexo ‘^’: O símbolo de circunflexo corresponde ao início da string ou linha de entrada e procura por uma string vazia.
  • Símbolo do dólar ‘$’: O símbolo do dólar corresponde ao final da string ou linha de entrada e procura uma string vazia.

Os outros dois caracteres de correspondência de âncora incluem o limite de palavra ‘\ b’ e o limite de não palavra ‘\ B’.

  • Limite de palavra ‘\ b’: Com \b, você pode afirmar a posição entre uma palavra e um caractere não-palavra. Em palavras simples, permite combinar palavras completas. Dessa forma, você pode evitar correspondências parciais. Você também pode usá-lo para substituir palavras ou contar ocorrências de palavras em uma string.
  • \B limite de não-palavra: é o oposto do \b limite de palavra em regex, pois afirma uma posição que não está entre caracteres de duas palavras ou não-palavra.

Vamos ver exemplos para ter uma ideia clara.

$ grep ‘^From’ tech.txt

O uso do cursor requer inserir a palavra ou padrão no caso correto. Isso porque é sensível a maiúsculas e minúsculas. Portanto, se você executar o seguinte comando, ele não retornará nada.

$ grep ‘^from’ tech.txt

Da mesma forma, você pode usar o símbolo $ para encontrar a frase que corresponde a um determinado padrão, string ou palavra.

$ grep ‘technology.$' tech.txt

Você também pode combinar os símbolos ^ e $. Vejamos o exemplo abaixo.

$ grep “^From \| technology.$” tech.txt

Como você pode ver, a saída contém frases que começam com “From” e terminam com “technology”.

#3. Agrupamento

Se você deseja pesquisar vários padrões de uma só vez, precisará usar o Agrupamento. Ele ajuda você a criar pequenos grupos de caracteres e padrões que você pode tratar como uma única unidade. Por exemplo, você pode criar um grupo (tech) que inclua o termo ‘t’, ‘e’,’ c’,’ h.’

Para ter uma ideia clara, vamos verificar um exemplo.

$ grep 'technol\(ogy\)\?' tech.txt

Com o agrupamento, você pode combinar padrões repetidos, capturar grupos e procurar alternativas.

Pesquisa alternativa com agrupamento

Vejamos um exemplo de uma pesquisa alternativa.

$ grep "\(tech\|technology\)" tech.txt

Se você deseja realizar uma pesquisa em uma string, precisará passá-la com o símbolo de barra vertical. Vejamos no exemplo abaixo.

$ echo “tech technological technologies technical” |  grep "\(tech\|technology\)"
#output

“tech technological technologies technical”

Grupos de captura, grupos de não captura e padrões repetidos

E os grupos de captura e não captura?

  Corrigir o código de erro 2 975 do Hulu

Você precisará criar um grupo no regex e passá-lo para a string ou um arquivo para capturar grupos.

$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
#output

tech655 tech655nical technologies655 tech655-oriented 655

E, para grupos sem captura, você precisará usar o ?: entre parênteses.

Por último, temos padrões repetidos. Você precisará modificar o regex para verificar padrões repetidos.

$ echo ‘teach tech ttrial tttechno attest’ | grep '\(t\+\)'
#output

‘teach tech ttrial tttechno attest’

Aqui, o regex procura uma ou mais instâncias do caractere ‘t’.

#4. Classes de personagens

Com classes de caracteres, você pode escrever expressões regex facilmente. Essas classes de caracteres usam colchetes. Algumas das classes de personagens bem conhecidas incluem:

  • [:digit:] – 0 a 9 dígitos
  • [:alpha:] – caracteres alfabéticos
  • [:alnum:] – caracteres alfanuméricos
  • [:lower:] – letras minúsculas
  • [:upper:] – letras maiúsculas
  • [:xdigit:] – dígitos hexadecimais, incluindo 0-9, AF, af
  • [:blank:] – caracteres em branco, como tabulação ou espaço

E assim por diante!

Vamos verificar alguns deles em ação.

$ grep [[:digit]] tech.txt

$ grep [[:alpha:]] tech.txt

$ grep [[:xdigit:]] tech.txt

#5. Quantificadores

Quantificadores são metacaracteres e estão no centro do regex. Estes permitem que você combine aparências exatas. Vamos vê-los abaixo.

  • * → Zero ou mais correspondências
  • + → uma ou mais correspondências
  • ? → Zero ou um corresponde
  • {x} → x correspondências
  • {x,} → x ou mais correspondências
  • {x,z} → de x a z corresponde
  • {, z} → até z correspondências
$ echo ‘teach tech ttrial tttechno attest’ | grep -E 't+'
#output

‘teach tech ttrial tttechno attest’

Aqui, ele procura as instâncias do caractere ‘t’ para uma ou mais correspondências. Aqui -E significa regex estendido (que discutiremos mais tarde).

#6. Regex estendido

Se você não gosta de adicionar caracteres de escape no padrão regex, deve usar regex estendido. Ele remove a necessidade de adicionar caracteres de escape. Para fazer isso, você precisará usar o sinalizador -E.

$ grep -E 'in+ovation' tech.txt

#7. Usando PCRE para fazer pesquisas complexas

PCRE (Perl Compatible Regular Expression) permite fazer muito mais do que escrever expressões básicas. Por exemplo, você pode escrever “\d” que denota [0-9].

Por exemplo, você pode usar o PCRE para pesquisar endereços de e-mail.

echo "Contact me at [email protected]" | grep -P "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
#output

Contact me at [email protected]

Aqui, o PCRE garante que o padrão seja correspondido. Da mesma forma, você também pode usar um padrão PCRE para verificar os padrões de data.

$ echo "The Sparkain site launched on 2023-07-29" | grep -P "\b\d{4}-\d{2}-\d{2}\b"
#output

The Sparkain site launched on 2023-07-29

O comando localiza a data no formato AAAA-MM-DD. Você também pode modificá-lo para corresponder a outro formato de data.

#8. Alternância

Se desejar correspondências alternativas, você pode usar os caracteres pipe de escape (\|).

$ grep -L ‘warning\|error’ /var/log/*.log
#output

/var/log/alternatives.log

/var/log/bootstrap.log

/var/log/dpkg.log

/var/log/fontconfig.log

/var/log/ubuntu-advantage.log

/var/log/upgrade-policy-changed.log

A saída lista os nomes de arquivo contendo “aviso” ou “erro”.

Palavras Finais

Isso nos leva ao final do nosso guia grep e regex. Você pode usar grep com regex extensivamente para refinar as pesquisas. Com o uso correto, você pode economizar muito tempo e ajudar a automatizar muitas tarefas, especialmente se você estiver usando-os para escrever scripts ou usar o regex na realização de pesquisas no texto.

A seguir, confira as perguntas e respostas mais frequentes sobre entrevistas sobre o Linux.