3.2 Lição 2
Certificação: |
Linux Essentials |
---|---|
Versão: |
1.6 |
Tópico: |
3 O poder da linha de comando |
Objetivo: |
3.2 Como buscar e extrair dados de arquivos |
Lição: |
2 of 2 |
Introdução
Nesta lição, trataremos de ferramentas para a manipulação de texto. Elas são frequentemente usadas por administradores de sistema ou programas para monitorar ou identificar automaticamente informações recorrentes específicas.
Pesquisando dentro de arquivos com grep
A primeira ferramenta que discutiremos nesta lição é o comando grep
. grep
é a abreviação da frase “global regular expression print” (impressão de expressão regular global) e sua principal funcionalidade é buscar por um padrão especificado dentro de arquivos. O comando exibe, destacada em vermelho, a linha que contém o padrão especificado.
$ grep bash /etc/passwd root:x:0:0:root:/root:/bin/bash user:x:1001:1001:User,,,,:/home/user:/bin/bash
O grep
, como a maioria dos comandos, também pode ser refinado com opções. As mais comuns são:
-i
-
a busca não diferencia maiúsculas de minúsculas
-r
-
a busca é recursiva (pesquisa todos os arquivos dentro do diretório especificado, mais seus subdiretórios)
-c
-
a busca conta o número de correspondências
-v
-
inverte o termo de correspondência para imprimir linhas que não correspondem ao termo de pesquisa
-E
-
ativa expressões regulares estendidas (necessárias para alguns dos metacaracteres mais avançados, como
|
,+
e?
)
O grep
tem muitas outras opções úteis. Consulte a página do manual para saber mais sobre ele.
Expressões regulares
A segunda ferramenta é muito poderosa. É usada para descrever pedacinhos de texto dentro de arquivos, também chamados de expressões regulares. As expressões regulares são utilíssimas na extração de dados de arquivos de texto através da construção de padrões. São comumente usadas em scripts ou em programação com linguagens de alto nível, como Perl ou Python.
Ao trabalhar com expressões regulares, é muito importante ter em mente que todos os caracteres contam; o padrão é escrito com o objetivo de corresponder a uma sequência específica de caracteres, conhecida como string. A maioria dos padrões usa os símbolos ASCII normais, como letras, dígitos, sinais de pontuação ou outros símbolos, mas também pode usar caracteres Unicode para corresponder a qualquer outro tipo de texto.
A lista a seguir explica os metacaracteres das expressões regulares usadas para formar os padrões.
.
-
Corresponde a qualquer caractere único (exceto nova linha)
[abcABC]
-
Corresponde a qualquer caractere dentro dos colchetes
[^abcABC]
-
Corresponde a qualquer caractere, exceto os que estão entre colchetes
[a-z]
-
Corresponde a qualquer caractere no intervalo
[^a-z]
-
Corresponde a qualquer caractere, exceto os do intervalo
sun|moon
-
Busca qualquer uma das strings listadas
^
-
Início de uma linha
$
-
Fim de uma linha
Todas as funcionalidades das expressões regulares também podem ser implementadas através do grep
. Você pode constatar que, no exemplo acima, a palavra não está entre aspas duplas. Para impedir que o shell interprete o próprio metacaractere, é recomendável que o padrão mais complexo esteja entre aspas duplas (" "). Para fins de prática, usaremos aspas duplas ao implementar expressões regulares. As outras aspas mantêm sua funcionalidade normal, conforme discutido nas lições anteriores.
Os exemplos a seguir enfatizam a funcionalidade das expressões regulares. Precisaremos de dados que estão dentro do arquivo, e portanto o próximo conjunto de comandos somente inclui strings diferentes no arquivo text.txt
.
$ echo "aaabbb1" > text.txt $ echo "abab2" >> text.txt $ echo "noone2" >> text.txt $ echo "class1" >> text.txt $ echo "alien2" >> text.txt $ cat text.txt aaabbb1 abab2 noone2 class1 alien2
O primeiro exemplo é uma combinação de buscas no arquivo sem e com expressões regulares. Para entender bem as expressões regulares, é muito importante mostrar a diferença. O primeiro comando procura pela string exata em qualquer lugar da linha, enquanto o segundo comando procura por conjuntos de caracteres que contenham qualquer um dos caracteres entre colchetes. Portanto, os resultados dos comandos são diferentes.
$ grep "ab" text.txt aaabbb1 abab2 $ grep "[ab]" text.txt aaabbb1 abab2 class1 alien2
O segundo conjunto de exemplos mostra a aplicação do metacaractere de início e fim da linha. É muito importante especificar a necessidade de colocar os 2 caracteres no lugar certo dentro da expressão. Ao se especificar o início da linha, o metacaractere precisa vir antes da expressão; já ao se especificar o final da linha, o metacaractere deve ser posto após a expressão.
$ grep "^a" text.txt aaabbb1 abab2 alien2 $ grep "2$" text.txt abab2 noone2 alien2
Além dos metacaracteres explicados anteriormente, as expressões regulares também possuem metacaracteres que permitem a multiplicação do padrão especificado anteriormente:
*
-
Zero ou mais do padrão anterior
+
-
Um ou mais do padrão anterior
?
-
Zero ou um do padrão anterior
Para os metacaracteres multiplicadores, o comando abaixo busca uma sequência que contenha ab
, um único caractere e um ou mais dos caracteres encontrados anteriormente. O resultado mostra que o grep
encontrou a string aaabbb1
, correspondendo à parte do abbb
, bem como abab2
. Como o caractere +
é um caractere de expressão regular estendida , precisamos passar a opção -E
para o comando grep
.
$ grep -E "ab.+" text.txt aaabbb1 abab2
A maioria dos metacaracteres é autoexplicativa, mas no início eles podem ser meio difíceis de assimilar. Os exemplos anteriores representam uma pequena parte da funcionalidade das expressões regulares. Experimente todos os metacaracteres da tabela acima para entender melhor como eles funcionam.
Exercícios Guiados
Usando grep
e o arquivo /usr/share/hunspell/en_US.dic
, encontre as linhas que correspondem aos seguintes critérios:
-
Todas as linhas que contêm a palavra
cat
em qualquer lugar da linha. -
Todas as linhas que não contêm nenhum dos seguintes caracteres:
sawgtfixk
. -
Todas as linhas que começam com 3 letras quaisquer e a palavra
dig
. -
Todas as linhas que terminam com pelo menos um
e
. -
Todas as linhas que contêm uma das seguintes palavras:
org
,kay
outuna
. -
Número de linhas que começam com um ou nenhum
c
seguido pela stringati
.
Exercícios Exploratórios
-
Encontre a expressão regular que corresponde às palavras na linha “Incluir” e que não corresponde às da linha “Excluir”::
-
Incluir:
pot
,spot
,apot
Excluir:
potic
,spots
,potatoe
-
Incluir:
arp99
,apple
,zipper
Excluir:
zoo
,arive
,attack
-
Incluir:
arcane
,capper
,zoology
Excluir:
air
,coper
,zoloc
-
Incluir:
0th/pt
,3th/tc
,9th/pt
Excluir:
0/nm
,3/nm
,9/nm
-
Incluir:
Hawaii
,Dario
,Ramiro
Excluir:
hawaii
,Ian
,Alice
-
-
Que outro comando útil é comumente usado para pesquisar dentro de arquivos? Quais funcionalidades adicionais ele oferece?
-
Escolha um dos exemplos da lição anterior e tente buscar por um padrão específico na saída do comando com a ajuda do
grep
.
Resumo
Nesta lição, você aprendeu:
-
Metacaracteres em expressões regulares
-
Como criar padrões com expressões regulares
-
Como buscar dentro de arquivos
Comandos usados nos exercícios:
grep
-
Busca por caracteres ou sequências dentro de um arquivo
Respostas aos Exercícios Guiados
Usando grep
e o arquivo /usr/share/hunspell/en_US.dic
, encontre as linhas que correspondem aos seguintes critérios:
-
Todas as linhas que contêm a palavra
cat
em qualquer lugar da linha.$ grep "cat" /usr/share/hunspell/en_US.dic Alcatraz/M Decatur/M Hecate/M ...
-
Todas as linhas que não contêm nenhum dos seguintes caracteres:
sawgtfixk
.$ grep -v "[sawgtfixk]" /usr/share/hunspell/en_US.dic 49269 0/nm 1/n1 2/nm 2nd/p 3/nm 3rd/p 4/nm 5/nm 6/nm 7/nm 8/nm ...
-
Todas as linhas que começam com 3 letras quaisquer e a palavra
dig
.$ grep "^...dig" /usr/share/hunspell/en_US.dic cardigan/SM condign predigest/GDS ...
-
Todas as linhas que terminam com pelo menos um
e
.$ grep -E "e+$" /usr/share/hunspell/en_US.dic Anglicize Anglophobe Anthropocene ...
-
Todas as linhas que contêm uma das seguintes palavras:
org
,kay
outuna
.$ grep -E "org|kay|tuna" /usr/share/hunspell/en_US.dic Borg/SM George/MS Tokay/M fortunate/UY ...
-
Número de linhas que começam com um ou nenhum
c
seguido pela stringati
.$ grep -cE "^c?ati" /usr/share/hunspell/en_US.dic 3
Respostas aos Exercícios Exploratórios
-
Encontre a expressão regular que corresponde às palavras na linha “Incluir” e que não corresponde às da linha “Excluir”:
-
Incluir:
pot
,spot
,apot
Excluir:
potic
,spots
,potatoe
Resposta:
pot$
-
Incluir:
arp99
,apple
,zipper
Excluir:
zoo
,arive
,attack
Resposta:
p+
-
Incluir:
arcane
,capper
,zoology
Excluir:
air
,coper
,zoloc
Resposta:
arc|cap|zoo
-
Incluir:
0th/pt
,3th/tc
,9th/pt
Excluir:
0/nm
,3/nm
,9/nm
Resposta:
[0-9]th.+
-
Incluir:
Hawaii
,Dario
,Ramiro
Excluir:
hawaii
,Ian
,Alice
Resposta:
^[A-Z]a.*i+
-
-
Que outro comando útil é comumente usado para pesquisar dentro de arquivos? Quais funcionalidades adicionais ele oferece?
O comando
sed
. Ele é capaz de encontrar e substituir caracteres ou conjuntos de caracteres dentro de um arquivo. -
Escolha um dos exemplos da lição anterior e tente buscar por um padrão específico na saída do comando com a ajuda do
grep
.Peguei uma das respostas dos Exercícios Exploratórios e busquei pela linha que tem as permissões de grupo para leitura, escrita e execução. Sua resposta pode ser diferente, dependendo do comando que você escolher e do padrão que criar.
$ cat contents.txt | tr -s " " | grep "^....rwx"
Este exercício serve para demonstrar que o
grep
também pode receber entrada de diferentes comandos e ajudar a filtrar as informações geradas.