Pesquisar Texto com grep no Linux

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como pesquisar texto de forma eficaz dentro de arquivos em um sistema Linux usando o poderoso comando grep. Você começará realizando buscas básicas por strings específicas em arquivos únicos e múltiplos, entendendo como o grep exibe as linhas correspondentes e identifica o arquivo de origem ao pesquisar em vários locais.

Com base nesses fundamentos, você explorará recursos mais avançados para refinar suas buscas. Você aprenderá a exibir números de linha para contexto, usar âncoras como ^ e $ para corresponder a padrões no início ou no fim de uma linha e aproveitar as capacidades das expressões regulares básicas e estendidas para realizar correspondências de padrões complexas e flexíveis.

Este é um Laboratório Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para concluir cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 96%. Ele recebeu uma taxa de avaliação positiva de 100% dos alunos.

Realizar uma Busca Básica em Arquivos com grep

Nesta etapa, você aprenderá o uso fundamental do comando grep para realizar buscas básicas dentro de arquivos. O comando grep (Global Regular Expression Print) é um utilitário de linha de comando poderoso usado para procurar uma string ou padrão específico em um ou mais arquivos e exibir as linhas que o contêm.

A sintaxe básica para o grep é: grep PATTERN [FILE...]

Vamos começar com uma tarefa simples: encontrar informações sobre o nosso usuário atual, labex, no arquivo de banco de dados de usuários do sistema. Essas informações são armazenadas no arquivo /etc/passwd.

Execute o seguinte comando no seu terminal para encontrar quaisquer linhas que contenham a string labex no arquivo /etc/passwd:

grep labex /etc/passwd

Você deverá ver uma linha de saída do arquivo que contém seu nome de usuário, labex.

labex:x:5000:5000::/home/labex:/usr/bin/zsh

O comando grep também pode pesquisar em vários arquivos simultaneamente. Agora vamos procurar a string labex em três arquivos de configuração importantes do sistema: /etc/passwd, /etc/shadow (que armazena informações seguras de contas de usuário) e /etc/group (que define grupos de usuários).

Como o arquivo /etc/shadow contém informações sensíveis, você precisa de privilégios administrativos para lê-lo. Você pode usar o comando sudo para executar o grep com esses privilégios. O usuário labex está configurado com acesso sudo sem senha.

Execute o seguinte comando para pesquisar por labex nos três arquivos:

sudo grep labex /etc/passwd /etc/shadow /etc/group

Observe que, ao pesquisar em vários arquivos, o grep prefixa cada linha correspondente com o nome do arquivo onde a correspondência foi encontrada.

/etc/passwd:labex:x:5000:5000::/home/labex:/usr/bin/zsh
/etc/shadow:labex:$y$j9T$L6UYJUCu2XytrdFToEOw.1$yp2xAOVTbIPmbABMnS/xDsyce7xayU80JgIs3lrqw4B:20265:0:99999:7:::
/etc/group:sudo:x:27:labex
/etc/group:ssl-cert:x:121:labex
/etc/group:labex:x:5000:
/etc/group:public:x:5002:labex

Isso mostra todas as linhas nesses três arquivos que estão relacionadas ao usuário labex.

Exibir Números de Linha com a Opção -n

Nesta etapa, você aprenderá como aprimorar a saída do grep exibindo os números das linhas onde as correspondências são encontradas. Isso é particularmente útil quando você precisa localizar um padrão dentro de um arquivo grande para edição ou análise posterior. A opção -n instrui o grep a prefixar cada linha de saída com seu respectivo número de linha do arquivo de entrada.

Vamos aproveitar o comando da etapa anterior. Você pesquisou pelo usuário labex em três arquivos do sistema. Agora, você realizará a mesma busca, mas também exibirá os números das linhas para cada correspondência.

Adicione a opção -n ao comando que você executou na etapa anterior. Lembre-se de usar sudo, pois você ainda está acessando o arquivo restrito /etc/shadow.

Execute o seguinte comando no seu terminal:

sudo grep -n labex /etc/passwd /etc/shadow /etc/group

Você verá uma saída semelhante à anterior, mas agora cada linha é precedida pelo nome do arquivo e pelo número da linha onde a correspondência ocorreu, separados por dois pontos.

/etc/passwd:32:labex:x:5000:5000::/home/labex:/usr/bin/zsh
/etc/shadow:32:labex:$y$j9T$L6UYJUCu2XytrdFToEOw.1$yp2xAOVTbIPmbABMnS/xDsyce7xayU80JgIs3lrqw4B:20265:0:99999:7:::
/etc/group:21:sudo:x:27:labex
/etc/group:60:ssl-cert:x:121:labex
/etc/group:61:labex:x:5000:
/etc/group:62:public:x:5002:labex

Observe os números como 32, 32, 21, 60, 61 e 62 na saída. Estes são os números das linhas. Por exemplo, a string labex foi encontrada na linha 32 de /etc/passwd e na linha 32 de /etc/shadow. Esta opção simples torna o grep uma ferramenta ainda mais eficaz para navegar e entender o conteúdo dos arquivos.

Corresponder à Posição da Linha com as Âncoras ^ e $

Nesta etapa, você avançará suas habilidades com o grep aprendendo a usar âncoras. Âncoras são caracteres especiais em expressões regulares que não correspondem a caracteres literais, mas sim a posições dentro de uma linha. Isso permite criar padrões de busca mais específicos e poderosos. As duas âncoras mais comuns são:

  • ^ (circunflexo): Corresponde ao início de uma linha.
  • $ (cifrão): Corresponde ao fim de uma linha.

Vamos ver como elas funcionam usando o arquivo /etc/passwd.

Primeiro, considere uma busca simples pela string root em /etc/passwd:

grep root /etc/passwd

Você pode obter várias linhas na saída, já que outras entradas podem conter a string "root".

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

Agora, vamos refinar isso. No arquivo /etc/passwd, o primeiro campo de cada registro é o nome de usuário. Para encontrar o registro especificamente para o usuário root, você pode ancorar sua busca ao início da linha usando ^.

Execute o seguinte comando. O padrão ^root diz ao grep para corresponder apenas a linhas que começam com root.

grep ^root /etc/passwd

Desta vez, a saída é muito mais específica, mostrando apenas a linha para o usuário root.

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

Em seguida, vamos usar a âncora de fim de linha, $. O último campo em um registro do /etc/passwd especifica o shell de login padrão do usuário. Podemos usar isso para encontrar todos os usuários que têm o /bin/bash como seu shell padrão.

O padrão bash$ corresponderá a qualquer linha que termine com a string bash.

grep bash$ /etc/passwd

Este comando exibirá todas as entradas de usuário onde o /bin/bash é o shell atribuído.

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

(Nota: Sua saída pode variar se outros usuários no sistema também usarem o bash como shell padrão.)

Ao usar as âncoras ^ e $, você pode restringir significativamente seus resultados de busca para encontrar exatamente o que procura.

Corresponder Padrões com Expressões Regulares Básicas

Nesta etapa, você explorará como usar Expressões Regulares Básicas (BRE) com o grep para criar padrões de busca mais flexíveis. Em BRE, certos caracteres, chamados metacaracteres, possuem significados especiais que vão além do seu valor literal. Isso permite que você corresponda a padrões, não apenas a strings fixas.

Exploraremos dois metacaracteres fundamentais: * (asterisco) e . (ponto).

Primeiro, vamos examinar o asterisco (*). Este metacaractere corresponde ao caractere imediatamente anterior a ele zero ou mais vezes. Para ver isso em ação, execute o seguinte comando. Envolveremos o padrão em aspas simples ('roo*') para garantir que o shell o trate como um padrão literal e não tente expandir o * como um curinga de arquivo.

grep 'roo*' /etc/passwd

A saída provavelmente mostrará várias linhas:

root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Vamos analisar este resultado. O padrão 'roo*' procura por linhas contendo ro seguido por zero ou mais os.

  • A linha root corresponde porque contém roo (ro seguido por um o).
  • A linha proxy corresponde porque contém ro (ro seguido por zero os) em "proxy".
  • A linha systemd-timesync corresponde porque contém ro em "Synchronization".
  • A linha rtkit corresponde porque contém ro em "proc".
  • A linha operator corresponde porque contém ro tanto em "operator" quanto em "/root".

Agora, vamos olhar para o metacaractere ponto (.). O ponto corresponde a qualquer caractere único. Execute o seguinte comando para ver como seu comportamento difere:

grep 'ro.' /etc/passwd

Desta vez, a saída mostra várias correspondências:

root:x:0:0:root:/root:/bin/bash
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
rtkit:x:108:113:RealtimeKit,,,:/proc:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

O padrão 'ro.' procura por linhas contendo ro seguido por exatamente um caractere qualquer.

  • A linha root corresponde porque ro é seguido por o em "root".
  • A linha proxy corresponde porque ro é seguido por x em "proxy".
  • A linha systemd-timesync corresponde porque ro é seguido por n em "Synchronization".
  • A linha rtkit corresponde porque ro é seguido por c em "proc".
  • A linha operator corresponde porque ro é seguido por outro caractere em "operator" e "/root".

Ao comparar as saídas, você pode ver claramente o poder das expressões regulares. Ambos os padrões 'roo*' e 'ro.' correspondem a várias linhas, demonstrando como diferentes metacaracteres permitem ajustar suas buscas de diferentes maneiras.

Usar Expressões Regulares Estendidas para Buscas Complexas

Nesta etapa, você aprenderá a usar Expressões Regulares Estendidas (ERE) para realizar buscas ainda mais complexas e poderosas. O ERE oferece um conjunto mais rico de metacaracteres do que as Expressões Regulares Básicas (BRE). Para habilitar o ERE, você pode usar o comando grep -E ou seu alias tradicional, egrep. Usar grep -E é a abordagem mais moderna e recomendada.

Primeiro, vamos explorar os quantificadores. No ERE, você pode especificar o número exato de vezes que um caractere deve aparecer usando chaves {}. Por exemplo, para encontrar qualquer linha que tenha exatamente dois 'o's minúsculos juntos, você pode usar o padrão o{2}.

Execute o seguinte comando. Envolvemos o padrão em aspas simples para evitar que o shell interprete incorretamente os caracteres especiais.

grep -E 'o{2}' /etc/passwd

A saída mostrará várias linhas contendo "oo":

root:x:0:0:root:/root:/bin/bash
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Este comando funciona porque o padrão o{2} corresponde especificamente a dois caracteres 'o' consecutivos, encontrados em "root", "spool" e outras entradas.

Em seguida, vamos olhar para a alternância. Este poderoso recurso do ERE permite que você procure por um entre vários padrões possíveis usando o símbolo de barra vertical |, que atua como um operador 'OU'.

Por exemplo, se você quisesse encontrar um registro de usuário para root ou Root (caso não tivesse certeza da capitalização), você poderia usar o seguinte comando:

grep -E 'root|Root' /etc/passwd

Este comando procura por qualquer linha contendo a string root ou a string Root. A saída mostra:

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

Tanto a linha do usuário root quanto a linha do operator correspondem porque ambas contêm a string "root" em minúsculas.

As Expressões Regulares Estendidas, habilitadas com grep -E, fornecem uma sintaxe mais expressiva e poderosa para criar padrões de busca complexos, tornando o grep uma ferramenta indispensável para o processamento de texto.

Resumo

Neste laboratório, você aprendeu como usar o comando grep para realizar buscas de texto fundamentais no Linux. Você começou executando buscas básicas por uma string específica dentro de um único arquivo e depois estendeu isso para pesquisar em vários arquivos, observando como o grep prefixa as linhas correspondentes com seus respectivos nomes de arquivo. Você também aprendeu a usar a opção -n para exibir o número da linha de cada correspondência, o que é útil para localizar padrões dentro de arquivos.

Além disso, você explorou capacidades de correspondência de padrões mais avançadas usando âncoras para encontrar texto no início (^) ou no fim ($) de uma linha. O laboratório progrediu para cobrir o uso de expressões regulares básicas e estendidas, permitindo que você construa padrões de busca mais complexos e poderosos para encontrar informações específicas dentro de arquivos.