Linux – Dominando o comando grep

O Linux possui muitos comandos nativos que são verdadeiros canivete-suiço para SysAdmins e criação de poderosos scripts.

Iniciei uma serie de posts sobre Shell Script, e agora irei começar a utilizar diversos comandos do Linux para tornar e dar vida a grandes funções com estes scripts, para isso, começarei a abordar separadamente os mais conhecidos e usados.

Neste post vou falar sobre o grep, muitos não sabem mas o significado do nome é (Globally Search a Regular Expression and Print), o nome já diz tudo o que esse comando faz, e deixando mais claro a ideia é procurar texto em uma string ou dentro de arquivos e mostrar linhas, ocorrências, usar combinações para pesquisar e o resultado da pesquisa ser mostrado na tela.

Você não precisa se preocupar em instalar o grep, pois ele já esta ae no seu Linux, para confirmar e verificar a versão veja o comando abaixo:

Digitando apenas o comando e dando enter ele não faz nada, porém mostra um exemplo para uso, e com o parâmetro -V a versão atual, no meu caso 2.6.

Agora segue os parâmetros que iremos utilizar e suas funções:

-c Conta quantas vezes apareceu a string que esta pesquisando
-v Mostra na tela “tudo” menos onde houver a ocorrência da string pesquisada
-i Realiza uma busca pela string ignorando o case, sendo case-insensitive
-o Ira mostrar na tela apenas as ocorrências da string pesquisada ignorando o resto
-n Ira mostrar na tela na primeira coluna a linha onde encontrou a string pesquisada
-B Numero de linhas a serem impressas antes da linha que contem a string pesquisada [BEFORE]
-A Numero de linhas a serem impressas na tela depois da encontrar a linha com a string [AFTER]
-C Quantidade de linhas antes e depois da linha que contem a string [CONTEXT]
-q Ira procurar pela string informada, porém estará em modo silencioso, nada sera impresso na tela, porém caso encontre o comando encerra com 0, caso não encontre nada será 1
-E Extende o uso de Regex no padrão e combinação, usando logica AND e OR por exemplo
-f Um arquivo com combinações de padrões com Regex, podendo usar varias combinações
-l Mostra somente o nome do arquivo onde foi encontrado a string pesquisada
-L Semelhante ao -v, porque mostra apenas os arquivo que não contem a string informada
-h Pesquisa varias arquivos, diretórios se com -r mas não mostra o nome dos arquivos
-r Ira realizar uma pesquisa recursiva em todos os diretórios a partir do informado
–color Deve-se passar o parâmetro ‘never’ caso não queira que a saída marque com cor a string ou ‘auto’ e ‘always’ para operar conforme necessite. Pode mudar a cor alterando GREP_COLOR, GREP_COLORS no environment

 

Exemplo básico

Agora um exemplo básico e bem didático para uso do comando, para isso vou criar um arquivo chamado palavras.txt e inserir um texto dentro e brincar com o grep.

Vamos visualizar nosso arquivo palavras.txt.

Agora vamos usar o grep e pesquisar pela string “Raspberry“, podemos usar de duas maneiras com o cat um pipe e logo em seguida um grep ou diretamente com o comando, a primeira opção é muito utilizada, porém você irá perder performance caso realizar pesquisa em muitos arquivo ou em um arquivo longo, veremos ainda neste post sobre isso.

Caso eu queira contar o numero de ocorrências da string “Raspberry”:

Se eu quiser ver tudo menos a string que contenham “Raspberry”:

Agora quero pesquisar pela string “arduino”.

Temos Arduino escrito de diversas maneiras, então vamos pedir para ser case-insensitive.

E se no lugar de mostrar a linha inteira ou o que estiver junto eu mostrar apenas a string procurada.

Se eu precisar saber o numero da linha onde foi encontrada a string.

Agora vamos pesquisar pela string “arduino” e obter também as 2 linhas antes da string encontrada.

O mesmo podemos fazer obtém as linhas depois da linha com a string pesquisada.

E podemos unir as duas opções, pegando e imprimindo linhas antes e depois da linha que contem a string pesquisada.

Caso não queira mostrar nada na tela, só saber se teve sucesso ou não na pesquisa.

Apenas reforçando no exemplo acima pesquisei a string “arduino” com o parâmetro -q (modo silencioso) e peguei a saída do ultimo comando executado com (echo $?), logo em seguida pesquisei por “Beaglebone” como não existe a saída foi 1.

 

Exemplo intermediário

Agora vamos subir um nível e brincar com outros parâmetros. Desta vez vamos criar mais 2 arquivos sistema.txt e hardware.txt, e também copiar a saída do dmesg para dmesg.log e brincar com estes caras.

Preparando os arquivos:

Eu criei sistema.txt e hardware.txt com palavras aleatórias, você pode agregar mais palavras para realizar seus testes.

Agora eu quero pesquisar em qualquer arquivo e que contenha a string “Raspberry”.

Os demais parâmetros anteriores se aplicam aqui também.

Agora se eu criar um diretório exemplo/ e mover o palavras.txt para ele será que vai encontrar a string “Raspberry” nele ainda?

Ele avisa que existe um diretório onde esta sendo feita a pesquisa, para que ele acesse o(s) diretório(s) deve-se passar o parâmetro -r para recursividade.

As vezes só interessa saber a ocorrências mas não o arquivo.

Se caso queira apenas saber qual arquivo contem a string mas não precisa mostrar ela.

E se quiser saber os arquivos que não possuem a string pesquisada.

Habilitando ou não o uso da saída colorida.

 

Exemplo avançado

Vamos dar mais um passo sobre esse incrível comando, só que agora com o básico de Expressões Regulares, e como exemplo usaremos o dmesg.log gerado acima.

Fazendo uma busca simples pela string “usb”.

Bastante coisa não é? Vamos trabalhar em cima extendendo os recursos de Regex da nossa expressão, por exemplo quero somente as linhas que contenham usb2 OU usb3, aplicando a logica OR.

Agora, vamos pesquisar por uma linha que contenha “usb” E tambem “Product:”, vamos aplicar a logica AND.

Mas eu quero só com “usb2” ou “usb3” casando com “Product:”.

Sentiu o poder da ferramenta? E você pode aplicar varias combinações com Expressões Regulares, estudaremos no futuro sobre isso.

Podemos criar um arquivo com nosso Regex e usar ele como padrão, alias, podemos colocar varias combinações neste arquivo.

 

Usando direto e com pipe

Lembra quando comentei de usar o grep direto e usar ele com qualquer comando um pipe e logo em seguida o grep? Vamos fazer uma pesquisa no /var/log/syslog.1 por quantas ocorrências da string “info” usando cat e o grep direto.

Agora uma dica legal, para desempenho de uso em grande escala do grep é setar LC_ALL=C antes:

Novamente verificando o tempo apos setar LC_ALL=C.

No meu syslog.1 não deu tanta diferença, mas fazer essa varredura em um aquivo de 500M você notara uma grande diferença.

Conhecemos, aprendemos e devoramos o grep, vimos o grande potencial que ele pode nos oferecer, ainda possui mais recursos e parâmetros que não vimos e pode ser visto com man grep, mas o foco e suas principais funções foi exemplificado aqui.

Espero que tenham gostado e até a próxima!

Share Button

CC BY-NC-SA 4.0 Linux – Dominando o comando grep by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.