Linux: procurando com o comando grep
- Publicado em Computação
O grep é um software livre (código-fonte aberto e gratuito) da suíte de aplicativos da Free Software Fundation (FSF) destinado à busca de padrões (expressões regulares comuns, extendidas e estilo Perl) ou textos simples no conteúdo de arquivos ou da entrada padrão (stdin), como a maioria dos aplicativos não-gráficos da FSF. Todas as distribuições Linux e o sistema operacional FreeBSD o incluem por padrão.
Este artigo lhe fornecerá apenas uma orientação básica. Caso deseje se tornar um especialista, consulte os seguintes livros: Practical Guide to Linux Commands, Editors, and Shell Programming, Linux Command Line and Shell Scripting Bible e Mastering Regular Expressions.
Apesar da localização de termos com o aplicativo grep ser bastante simples, alguns de seus recursos são desconhecidos pelos usuários. Neste artigo, relembraremos alguns aspectos importantes na utilização do grep em um ambiente Linux Ubuntu 8 - Intrepid Ibex no modo gráfico (gnome). O arquivo texto utilizado possui o seguinte conteúdo:
Executando buscas com o comando grep
Conforme a documentação oficial do grep, a sua utilização para busca em arquivos é dada pelo seguinte comando:
grep [OPÇÕES] PADRÃO [ARQUIVO...]
Como o grep também pode efetuar o processamento de texto proveniente da entrada padrão (stdin), o comando acima é equivalente a: cat ARQUIVO | grep PADRÃO.
O grep possui várias opções (consulte o man grep). Dentre as mais relevantes:
Ignorar a distinção entre letras maiúsculas e minúsculas: "grep -i"
Retonar apenas a quantidade de ocorrências encontradas: "grep -c"
Destacar expressões com cor: "grep --color"
Retornar o nome dos arquivos analisados que possuem a expressão especificada: "grep -l"
Limitar a quantidade de expressões encontradas em um único arquivo: "grep -m NUM"
Retonar os números das linhas (posição em relação ao arquivo): "grep -n"
Executar a busca em todas as pastas recursivamente: "grep -R"
Os comandos egrep, fgrep e rgrep são atalhos para os seguintes comandos, respectivamente: grep -E, grep -F e grep -r.
Expressões regulares
As expressões regulares (também conhecidas por regex) determinam um conjunto de regras de sintaxe de um importante sistema de processamento de texto. Enquanto o grep utiliza essa técnica apenas para a busca de determinado texto, os aplicativos sed e awk também podem efetuar o processamento do texto.
Essas regras podem se tornar muito complexas e até mesmo ininteligíveis em determinadas aplicações; portanto, apenas a sua utilização com o intuito de localizar determinados padrões serão abordados (a teoria completa demandaria várias horas de estudo).
O primeiro passo para se utilizar expressões regulares é ter conhecimento da tabela de meta-caracteres (caracteres especiais):
Caractere | Descrição |
Posicionamento | |
^ | Início de uma linha |
$ | Fim de uma linha |
\< | Início de uma palavra |
\> | Fim de uma palavra |
Caracteres únicos | |
. | Caractere qualquer único (apenas um caractere) |
[...] | Qualquer caractere único (apenas um caractere) incluso entre os colchetes |
[^...] | Qualquer caractere único (apenas um caractere) que não esteja entre os colchetes |
\ | Caractere de escape |
Quantidade | |
* | Qualquer quantidade (inclusive, zero) de ocorrências da expressão regular ou caractere precedente |
.* | Qualquer quantidade (inclusive, zero) de ocorrências da expressão regular ou caractere precedente |
+ | Uma ou mais ocorrências da expressão regular ou caractere precedente |
{N} | N ocorrências da expressão regularprecedente |
Baseando-se nessa tabela, podemos encontrar as expressões "iminente" ou "eminente" através do padrão '.minente', pois o ponto combinará com 1 caractere qualquer com o comando grep '.minente' arquivo.txt:
Entretanto, o comando acima também encontrará expressões como "wminente" ou "aminente". Para filtrar ainda mais o resultado da pesquisa, teríamos de usar uma expressão regular que combinasse apenas com as vogais "i" e "e" como o comando grep '[ie]minente' arquivo.txt:
Para encontrarmos ambas as palavras desprezando-se a caixa (letras maiúsculas ou minúsculas), devemos utilizar a opção -i (ignore case). Por exemplo, o comando grep -i '[ie]minente' arquivo.txt encontraria as palavras iminente, Iminente, Eminente ou eminente.
E caso quiséssemos encontrá-las apenas no início de uma linha, grep -i '^[ie]minente' arquivo.txt:
Ou no final de uma linha, com o comando grep -i '[ie]minente$' arquivo.txt
A aprendizagem de expressões regulares demanda muito treinamento. Experimente outros padrões em arquivos de texto cujo conteúdo já seja do seu conhecimento.