Neste tópico vamos manipular arquivos através de expressões regulares. Aprenderemos a criar expressões regulares (REGEX) simples e manusear essas ferramentas para realizar essas pesquisas.
Peso 2
Basicamente, para realizarmos buscas de conteúdo em dados, arquivos e pastas, precisamos ter o completo entendimento do uso de expressões regulares (REGEX). Podemos dizer que elas são super-filtros de uma pesquisa muito complexa (ou não!) que dizem de forma especifica algo complexo.
Para realizarmos essas pesquisas, definimos uma regra, composta de símbolos (metacaracteres), onde, cada um deles tem uma função especifica e que atende parte da nossa regra. Sem conhecer o significado desses símbolos, é praticamente impossível usar as ferramentas disponíveis para a realização dessas tarefas.
Metacaracteres - são caracteres que tem significados especiais.
Os metacaracteres mais comuns:
. - o ponto representa qualquer caractere único. Por exemplo: vamos dizer que você queira procurar a palavra file no arquivo /etc/fstab. E vamos imaginar também que você não sabe se file é com a ou com i (fale ou file....cruel né? rsrs). Então para trazer todas as palavras que iniciam com a letra f e que terminem com as letras le, basta digitar a expressão:
grep "f.le" /etc/fstab . O resultado é para vir destacado com a palavra file.
\ - a contra barra serve para indicar a mudança no significado de outro caractere. Por exemplo: se você quer procurar por todos os pontos (.) em um arquivo, NÃO poderá colocar grep "." arquivo. Dessa forma, o resultado irá exibir todos os caracteres presentes no arquivo. Para pesquisar apenas os pontos finais, o CORRETO seria o uso da barra antes do termo pesquisado, dessa forma: grep "\." arquivo. Ou seja, transforma um metacaractere em um litoral comum.
[ ] - inclui na pesquisa QUALQUER caractere que esteja dentro do colchete. Por exemplo: se você pesquisar [ABCDEFG], ele irá mostrar todas as palavras que possuem as letras dentro do colchetes em maiusculas. Para mostrar um intervalo, basta pesquisar [A-J]. Experimente: digite no seu terminal:
echo "ESSA SERA Uma frasE CurtA" | grep [A-Z]
O resultado serão todas as letras maiusculas destacadas.
Mais um exemplo:
Veja a diferença entre usar [13458] e [1-9]. No primeiro caso, o sistema mostrará apenas as pastas bola1, bola3, bola4, bola5, bola 8 enquanto no segundo caso, usando o hífen, será exibido as pastas de 1 ATÉ 9.
grep "f.le" /etc/fstab . O resultado é para vir destacado com a palavra file.
\ - a contra barra serve para indicar a mudança no significado de outro caractere. Por exemplo: se você quer procurar por todos os pontos (.) em um arquivo, NÃO poderá colocar grep "." arquivo. Dessa forma, o resultado irá exibir todos os caracteres presentes no arquivo. Para pesquisar apenas os pontos finais, o CORRETO seria o uso da barra antes do termo pesquisado, dessa forma: grep "\." arquivo. Ou seja, transforma um metacaractere em um litoral comum.
[ ] - inclui na pesquisa QUALQUER caractere que esteja dentro do colchete. Por exemplo: se você pesquisar [ABCDEFG], ele irá mostrar todas as palavras que possuem as letras dentro do colchetes em maiusculas. Para mostrar um intervalo, basta pesquisar [A-J]. Experimente: digite no seu terminal:
echo "ESSA SERA Uma frasE CurtA" | grep [A-Z]
O resultado serão todas as letras maiusculas destacadas.
Mais um exemplo:
Veja a diferença entre usar [13458] e [1-9]. No primeiro caso, o sistema mostrará apenas as pastas bola1, bola3, bola4, bola5, bola 8 enquanto no segundo caso, usando o hífen, será exibido as pastas de 1 ATÉ 9.
OBS: As aspas " " não são metacaracteres.
Algumas expressões POSIX
[[:alpha:]] - procura todos os caracteres a-z A-Z
[[:upper:]] - lista apenas as maiusculas A-Z
[[:lower:]] - lista apenas a minusculas a-z
[[:digit:]] - equivale aos números 0-9
[[:alnum:]] - lista todos os caracteres alfa numéricos, 0-9 A-Z a-z
[[:space:]] - procura os espaços
* (asterisco) - representa qualquer sequencia de zero ou mais caracteres. Exemplos: (aproveitando o exemplo da imagem acima)
ls -ld b* - mostra todos os arquivos iniciados com a letra b
ls -ld /etc/*.??? - mostra todos os arquivos que terminam com três caracteres após o ponto.
? - representa um único caractere. Veja exemplo anterior e mais abaixo detalho ele melhor.
^ - indica começo de linha. Podemos ter que pesquisar por palavras ou símbolos que se encontram no inicio da linha. Para isso usamos o metacaractere ^.
Exemplo: cat /etc/passwd | grep "^r" ou simplesmente grep "^r" /etc/passwd - irá mostrar os usuários que começam com a letra r.
^ - indica começo de linha. Podemos ter que pesquisar por palavras ou símbolos que se encontram no inicio da linha. Para isso usamos o metacaractere ^.
Exemplo: cat /etc/passwd | grep "^r" ou simplesmente grep "^r" /etc/passwd - irá mostrar os usuários que começam com a letra r.
$ - indica final de linha. Exemplo:
cat /etc/passwd | grep "login$" - mostra os registros que terminam com a palavra login.
OBS: Para procurar linhas em branco, utilizamos a expressão "^$".
cat /etc/passwd | grep "login$" - mostra os registros que terminam com a palavra login.
OBS: Para procurar linhas em branco, utilizamos a expressão "^$".
{ } - representa uma lista. Usamos quando queremos uma representação quantificada. Nesse caso o item anterior corresponde ao que está dentro das chaves.
{x} - significa que o item anterior irá corresponder a x vezes;
{x,} - o item anterior corresponde pelo menos x vezes;
{x,z} - item anterior corresponde de x até z.
Exemplo:
mkdir teste{1..9} - irá criar pastas teste1, teste2 até teste9.
ls -ld /etc/*.{conf,cfg} - lista os arquivos em /etc/ terminados em .conf e .cfg.
echo "Meu telefone é 55.11-1234-5678." | grep -E "[0-9]{2}\.[0-9]{2}-[0-9]{4}-[0-9]{4}" - nessa expressão regular, passamos ao grep que ele mostre números de 0 a 9 [0-9], que se repetem 2 vezes {2}, seguida de um ponto \. seguido novamente de números de 0 a 9 [0-9], repetido 2 vezes {2}, seguido de hífen - e que depois mostre números de 0 a 9 [0-9], que se repetem 4 vezes {4}, seguido de hífen e por último, números de 0 a 9 [0-9], correspondente a 4 vezes {4}. Esse é o formato do número que está nesta mensagem. Existem outros formatos de telefone. O importante é entender o que foi feito.
Pode ser usado também como incremento. Exemplo:
mkdir teste{10..50..5} - cria pastas de 5 em 5, dentro do intervalo de 10 até 50 (10,15,20,25...)
[^] - lista negada. Quando o acento circunflexo aparece dentro dos colchetes, ele nega a expressão e mostra o oposto.
| - pipe. Metacaractere de alternação. Apresenta uma alternação OU. Mostra, uma palavra ou outra palavra (palavra|outra palavra).
Metacaracteres de Repetição
Refere-se ao item precedente.
* - apresenta o item 0 ou mais vezes.
\+ - apresenta o item 1 ou mais vezes
\? - apresenta o item 0 ou uma vez.
Exemplo:
Explicando: no arquivo exemplo, existem 3 palavras, circula, circular, circularei. Usando os filtros de repetição:
grep "circular*" exemplo - mostra os resultados que contenham a palavra circula, com um "r" (item precedente, lembrem-se disso) no final, 0 ou mais vezes. Neste caso, o "r" no final, pode ou não existir.
grep "circular\+" exemplo - procura as palavras "circula", com final "r", uma ou mais vezes. Resultado foram apenas as palavras circular e circularei. Neste caso, é necessário que o "r" no final exista pela menos uma vez.
grep "circular\?" - procura as palavras "circula" com final "r", em que aparecem 0 ou apenas 1 vez. Neste caso, todas as palavras foram encontradas, pois todas corresponderam a pesquisa.
Metacaractere de agrupamento
( ) - tem a finalidade para agrupar expressões onde aplica os operadores de repetição a um grupo. Não deve-se usar dentro de conjuntos de caracteres pois quando aplicado dessa forma, possui sentido literal.
Exemplos:
echo "O texto é constitucional ou inconstitucional? Escolha." | grep -E "(in)?constitucional" - o resultado deverá ser as palavras "constitucional" e "inconstitucional" destacadas.
O in entre ( ) indica que a palavra deve ter essas letras na mesma ordem em que aparecem dentro dos parenteses. Quando usamos o ?, estamos dizendo que essa condição pode aparecer zero ou uma vez. Por isso que as palavras "constitucional" (0 vezes) é destacada e "inconstitucional" (uma vez) também é destacada.
Experimente usar a mesma expressão, só que em vez de usar o ?, use o sinal de +. É para apenas ser destacada a palavra "inconstitucional", pois a condição é "uma ou mais vezes" (por causa do sinal de +).
GREP (EGREP e FGREP)
GREP (Global Expression Regular Print)
Programa que realiza busca em conteúdos de arquivos, através de uma expressão regular.
Sintaxe: grep [opções] regex arquivo ou comando | grep [opções] regex
As opções mais comuns:
-i - ignora maiusculas e minusculas;
-E - utiliza caracteres das expressões regulares estendidas;
-n - mostra o número da linha em que a ocorrência foi encontrada;
-c - exibe uma contagem das linhas encontradas
-v - exibe as linhas que NÃO correspondem a expressão regular
Exemplos:
No exemplo acima, pedi para o grep listar tudo que contivesse a palavra "apt" e que me mostrasse a linha correspondente as ocorrências encontradas.
Outro exemplo:
O primeiro comando não funcionou, pois o grep sozinho não consegue resolver alguns caracteres de uma expressão regular estendida. A solução foi usar a opção -E, junto com a opção -n para listar o número da linha.
OBS: O comando EGREP age da mesma forma que a opção -E.
FGREP
Age da mesma forma da opção -F, onde as expressões regulares padrões são ignoradas e os caracteres passam a ser interpretados de forma literal. Isso agiliza buscas de resultados.
SED - Stream Editor
Utilizado para procurar e substituir padrões em textos. Imagine que você quer substituir todas as palavras paulo, em um arquivo de 1000 linhas? Trabalhoso não? O sed realiza essa busca substituindo ou deletando o que for passado para ele na linha de comando.
Sintaxe:
sed [opções] 'comando sed' arquivo
Opções:
-e - executa a expressão e comando a seguir. Essa opção é opcional se apenas um comando for usado;
-n - não mostra as linhas que não correspondem a expressão;
-i - modifica o arquivo;
-f - lê expressões e comandos a partir de um arquivo;
-g - trata todas as substituições como globais;
Comandos sed:
s - realiza substituições. Sintaxe fica da seguinte forma: s/padrão/substituição/flags;
d - apaga linhas;
r - insere conteúdo do arquivo indicado na ocorrência da expressão;
w - escreve a saída no arquivo indicado;
g - substitui todas as ocorrências da expressão na linha atual;
Flags usadas com o comando s:
g - substitui todas as instâncias do padrão;
n - substitui a enésima instância do padrão.
y - traduz caracteres
Exemplos:
sed '^$/d' /etc/profile - exclui as linhas em branco do arquivo profile
sed -i '^$/d' /etc/profile - exclui as linhas em branco e ALTERA o arquivo profile. Cuidado ao usar a opção -i.
OBS: ao usar a opção -i, o sed não mostra o resultado do comando na saída padrão (stdout), pois a alteração foi feita no arquivo. O sed só mostrará na saída padrão, caso ele NÃO altere o arquivo.
sed 's/root/ROOT/g' /etc/passwd - altera o nome root, em minusculo, para ROOT em todas as ocorrências (/g - globalmente)
Outros exemplos:
No exemplo acima, eu troquei todas as letras c (/c/) para a letra v (/v/) através do comando sed y que troca caracteres.





Comentários
Postar um comentário