Exemplos de uso do comando grep do Linux

O comando Linux grep é usado como um método para filtrar a entrada. GREP significa Global Regular Expression Printer e, portanto, para usá-lo com eficácia, você deve ter algum conhecimento sobre expressões regulares.

Neste artigo, você aprenderá vários exemplos que o ajudarão a entender o comando grep.

Como pesquisar uma string em um arquivo usando GREP

A captura de tela do manual do Linux grep Command

Imagine que você tenha um arquivo de texto chamado livros com os seguintes títulos de livros infantis:

  • Robin Hood
  • Chapeuzinho Vermelho
  • Peter Pan
  • Cachinhos Dourados e os três ursos
  • Branca de Neve e os Sete Anões
  • Pinochio
  • O gato no chapéu
  • Os três Porquinhos
  • O gruffalo
  • Charlie e a fabrica de chocolate

Para localizar todos os livros com a palavra "The" no título, você usaria a seguinte sintaxe:

grep Os livros. 

Os seguintes resultados serão retornados:

Cachinhos Dourados e os três ursos
Branca de Neve e os Sete Anões
O gato no chapéu
Os três Porquinhos
O gruffalo
Charlie e a fabrica de chocolate.

Em cada caso, a palavra "The" será destacada.

A pesquisa diferencia maiúsculas de minúsculas, portanto, se um dos títulos tivesse "o" em vez de "O", ele não teria sido retornado.

Para ignorar o caso, você pode adicionar a seguinte opção:

grep os livros --ignore-case. 

Você também pode usar a opção -i da seguinte maneira:

grep -i os livros. 

Pesquisar uma string em um arquivo usando expressões regulares

O comando grep é muito poderoso. Você pode usar uma variedade de técnicas de correspondência de padrões para filtrar os resultados.

Neste exemplo, mostraremos como pesquisar uma string em um arquivo usando curingas.

Imagine que você tenha um arquivo chamado places com os seguintes nomes de lugares escoceses:

Aberdeen
Aberystwyth
aberlour
Inverurie
inverness
Newburgh
novo veado
New Galloway
Glasgow
Edimburgo.

Se você quiser encontrar todos os lugares com inver no nome, use a seguinte sintaxe:

grep inver * locais. 

O caractere asterisco (*) não funciona como no Bash normal. No contexto do grep, que lida com expressões regulares, o asterisco se comporta de maneira diferente. Em vez de corresponder a qualquer ou nenhum caractere, como Bash, ele corresponde ao padrão inserido mais qualquer ou nenhuma repetição subsequente desse padrão.

No exemplo acima, ele corresponde a:

Inverurie
inverness.

porque ambos contêm o padrão "inver" conforme inserido mais zero repetições adicionais desse padrão. Para ver isso novamente com mais clareza, adicione:

repeatinverinverinver. 

para a lista. Não, não faz muito sentido, mas vai demonstrar como o asterisco funciona. Tente executar o comando novamente.

grep inver * locais.

Você vê a nova linha? Isso não funcionaria no Bash, mas funciona aqui.

Para tornar as coisas ainda mais estranhas, execute o comando sem o asterisco.

grep inver coloca. 

Os resultados são os mesmos. Por padrão, grep irá procurar por um padrão em qualquer lugar que ele apareça na string de texto. Também não diferencia quantas vezes aparece.

Outro curinga que você pode usar é o ponto (.). Você pode usar isso para corresponder a uma única letra.

locais grep inver.r. 

O comando acima encontraria lugares chamados inverurie e inverary, mas não encontraria invereerie porque só pode haver um curinga entre os dois r's denotado pelo único ponto.

O caractere curinga de ponto é útil, mas pode causar problemas se você tiver um como parte do texto que está pesquisando.

Por exemplo, veja esta lista de nomes de domínio.

  • linux.lifewire.com
  • pcsupport.lifewire.com
  • mp3.lifewire.com
  • minecraft.lifewire.com
  • androidgames.lifewire.com
  • netforbeginners.lifewire.com
  • Dailylinuxuser.com
  • google.co.uk
  • google.au
  • direct.gov.uk
  • fakesite.lifewire1com.com

Para encontrar todos os URLs da lifewire.com, você pode pesquisar usando a seguinte sintaxe:

grep .com domainnames. 

O comando acima cairia se a lista contivesse o seguinte nome:

Dailylinuxuser.com. 

Você pode, portanto, tentar a seguinte sintaxe:

nomes de domínio grep lifewire.com. 

Isso funcionaria bem, a menos que houvesse um domínio com o seguinte nome:

fakesite.lifewire1com.com. 

Para pesquisar realmente o termo lifewire.com, você precisaria escapar o ponto da seguinte maneira:

grep lifewire \\. com nomes de domínio. 

O caractere curinga final para mostrar a você é o ponto de interrogação, que representa zero ou um caractere.

Por exemplo:

grep -E? ber placenames. 

O comando acima retornaria aberdeen, aberystwyth ou mesmo berwick, se estivesse na lista. Observe o sinalizador extra '-E' também. Grep não reconhecerá o? caractere sem habilitar o suporte estendido de expressão regular.

Pesquise Strings no Início e no Fim da Linha usando grep

O carat (^) e o símbolo do dólar ($) permitem que você pesquise padrões no início e no final das linhas.

Imagine que você tenha um arquivo chamado football com os seguintes nomes de times:

  • Blackpool
  • Liverpool
  • Cidade de Manchester
  • Leicester City
  • Manchester United
  • Newcastle United
  • FC United Of Manchester

Se você quisesse encontrar todos os times que começaram com Manchester, você usaria a seguinte sintaxe:

grep ^ times de Manchester. 

O comando acima retornaria Manchester City e Manchester United, mas não FC United Of Manchester.

Como alternativa, você pode encontrar todas as equipes que terminam com United usando a seguinte sintaxe:

grep United $ times. 

O comando acima retornaria ao Manchester United e Newcastle United, mas não ao FC United Of Manchester.

Contando o número de correspondências usando grep

Se você não deseja retornar as linhas reais que correspondem a um padrão usando grep, mas deseja apenas saber quantas existem, pode usar a seguinte sintaxe:

arquivo de entrada do padrão grep -c. 

Se o padrão foi correspondido duas vezes, o número 2 seria retornado.

Encontrando todos os termos que não combinam usando grep

Imagine que você tenha uma lista de nomes de lugares com os países listados a seguir:

  • aberdeen escócia
  • glasgow Escócia
  • liverpool inglaterra
  • Colwyn Bay
  • Londres, Inglaterra

Você deve ter notado que colwyn bay não tem nenhum país associado a ela.

Para pesquisar todos os lugares com um país, você pode usar a seguinte sintaxe:

grep land $ places. 

Os resultados retornados seriam todos os lugares, exceto colwyn bay.

Obviamente, isso só funciona para lugares que terminam em terra (dificilmente científico).

Você pode inverter a seleção usando a seguinte sintaxe:

grep -v pousar $ casas. 

Isso iria encontrar todos os lugares que não terminam com terra.

Como encontrar linhas vazias em arquivos usando grep

Imagine que você tenha um arquivo de entrada que é usado por um aplicativo de terceiros que para de ler o arquivo quando encontra uma linha vazia da seguinte maneira:

  • aberdeen escócia
  • Inverness Escócia
  • inglaterra liverpool
  • Colwyn Bay Wales

Quando o aplicativo chega à linha após o liverpool, ele para de ler, o que significa que a baía de colwyn foi totalmente perdida.

Você pode usar o grep para pesquisar linhas em branco com a seguinte sintaxe:

grep ^ $ places. 

Isso não é particularmente útil porque apenas retorna as linhas em branco.

Você poderia, é claro, obter uma contagem do número de linhas em branco como uma verificação para ver se o arquivo é válido da seguinte maneira:

grep -c ^ $ casas. 

No entanto, seria mais útil saber os números das linhas que têm uma linha em branco para que você possa substituí-los. Você pode fazer isso com o seguinte comando:

grep -n ^ $ casas. 

Como pesquisar strings de caracteres maiúsculos ou minúsculos usando grep

Usando grep, você pode determinar quais linhas em um arquivo têm caracteres maiúsculos usando a seguinte sintaxe:

grep nome de arquivo '[A-Z]'. 

Os colchetes [] permitem determinar a gama de caracteres. No exemplo acima, ele corresponde a qualquer caractere que esteja entre A e Z.

Portanto, para corresponder a caracteres minúsculos, você pode usar a seguinte sintaxe:

grep '[a-z]' nome do arquivo. 

Se você deseja corresponder apenas letras e não numéricos ou outros símbolos, você pode usar a seguinte sintaxe:

grep '[a-zA-Z]' nome do arquivo. 

Você pode fazer o mesmo com os números da seguinte maneira:

grep '[0-9]' nome do arquivo. 

Procurando por padrões repetidos usando grep

Você pode usar chaves {} para pesquisar um padrão de repetição.

Imagine que você tenha um arquivo com os números de telefone da seguinte maneira:

  • 055-1234
  • 055-4567
  • 555-1545
  • 444-0167
  • 444-0854
  • 4549-2234
  • x44-1234

Você sabe que a primeira parte do número deve ter três dígitos e deseja encontrar as linhas que não correspondem a esse padrão.

Pelo exemplo anterior, você sabe que [0-9] retorna todos os números em um arquivo.

Neste caso, queremos as linhas que começam com três números seguidos por um hífen (-). Você pode fazer isso com a seguinte sintaxe:

grep "^ [0-9] [0-9] [0-9] -" números. 

Como sabemos dos exemplos anteriores, o caractere (^) significa que a linha deve começar com o seguinte padrão.

O [0-9] irá procurar qualquer número entre 0 e 9. Como está incluído três vezes, corresponde a 3 números. Finalmente, há um hífen para indicar que um hífen deve suceder aos três números.

Usando as chaves, você pode diminuir a pesquisa da seguinte maneira:

grep "^ [0-9] \ {3 \} -" números. 

A barra escapa do {colchete para que funcione como parte da expressão regular, mas, em essência, o que isso quer dizer é [0-9] {3}, o que significa qualquer número entre 0 e 9 três vezes.

As chaves também podem ser usadas da seguinte forma:

{5,10}
{5,}

O {5,10} significa que o caractere que está sendo pesquisado deve ser repetido pelo menos 5 vezes, mas não mais do que 10, enquanto {5,} significa que o caractere deve ser repetido pelo menos 5 vezes, mas pode ser mais do que naquela.

Usando a saída de outros comandos usando grep

Até agora, vimos a correspondência de padrões em arquivos individuais, mas o grep pode usar a saída de outros comandos como entrada para correspondência de padrões.

Um ótimo exemplo disso é usar o comando ps que lista os processos ativos.

Por exemplo, execute o seguinte comando:

ps -ef. 

Todos os processos em execução em seu sistema serão exibidos.

Você pode usar o grep para pesquisar um processo em execução específico da seguinte maneira:

ps -ef | grep firefox. 

Resumo

O comando grep é fundamental Linux e é um comando que vale a pena aprender, pois tornará sua vida muito mais fácil ao pesquisar arquivos e processos ao usar o terminal.