fbpx Certificação Linux: Comando grep no Linux (filtra dados) [Guia Básico]

Blog

Comando grep no Linux (filtra dados) [Guia Básico]

📅 01/01/2019 ⏱ 7 min ✍️ Uira Ribeiro
Linuxcomandos
Comando grep no Linux (filtra dados) [Guia Básico]

O comando grep no Linux é largamente usado no dia a dia das tarefas administrativas em Linux. Ele filtra as linhas de um determinado arquivo procurando por uma expressão regular como padrão.

O grep pode ler um ou mais arquivos que são passados como argumento ou pode receber na entrada padrão o redirecionamento da saída de outro processo. Se o grep receber mais de um arquivo ou um wildcard como argumento para efetuar a sua busca, ele vai indicar o nome do arquivo seguido de dois pontos e a linha encontrada.

O grep utiliza o padrão de Expressões Regulares POSIX BRE.

Assim, os meta-characters ? + { } (  )  não tem significado especial. No padrão BRE esses caracteres somente são interpretados com significado especial se precedidos com a contra-barra  \?   \+   \{   \}  \|   \(   \).

Suas opções mais frequentes são:

  • -c: Mostra somente a contagem das ocorrências nos arquivos e não as linhas onde as ocorrências foram encontradas;
  • -h: Mostra somente as linhas encontradas, sem a indicação do nome dos arquivos; 
  • -i: Procura as ocorrências ignorando se as letras estão em maiúsculas ou minúsculas;
  • -v: Mostra todas as linhas do arquivo procurado menos as ocorrências encontradas. Tem o efeito inverso;
  • -n: Mostra, além do texto das linhas encontradas, o número das linhas dentro dos arquivos;
  • -B n: Mostra n linhas antes da linha encontrada;
  • -A n: Mostra n linhas depois da linha encontrada.
  • -E    Muda o padrão POSIX BRE para POSIX ERE.
  • -F    Não interpreta nenhum meta-caractere

Exemplos:

Procura a palavra uira no arquivo /etc/passwd:

$ grep uira /etc/passwduira:x:500:100:uira:/home/uira:/bin/bash

Procura todas as linhas começadas com a letra u no arquivo /etc/passwd. O acento circunflexo simboliza o início de uma linha:

$ grep "^u" /etc/passwduucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bashuira:x:500:100:uira:/home/uira:/bin/bash

Procura todas as linhas terminadas com a palavra false. O símbolo $ representa o fim de uma linha:

$ grep "false$" /etc/passwdmail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/falsewwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false

Procura todas as linhas que iniciam com as vogais no /etc/passwd. A expressão regular chamada lista procura qualquer um dos caracteres dentro do colchete:

$ grep "^[aeiou]" /etc/passwduucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bashat:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bashuira:x:500:100:uira:/home/uira:/bin/bashalias:x:501:1000::/var/qmail:/bin/false

Procura por todas as linhas em que o primeiro caracter seja qualquer um e o segundo caracter seja uma vogal. O ponto final na expressão regular simboliza “um caractere qualquer”:

$ grep "^.[aeiou]" /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/bin/bashnews:x:9:13:News system:/etc/news:/bin/bashuira:x:500:100:uira:/home/uira:/bin/bash

Procura por linhas que contenham uma sequência de pelo menos quatro números consecutivos:

$ grep "[0-9][0-9][0-9][0-9]" /etc/passwdsquid:x:31:65534:WWW-proxy squid:/var/cache/squid:/bin/falsenobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bashalias:x:501:1000::/var/qmail:/bin/falseqmaild:x:502:1000::/var/qmail:/bin/false

Procura em todos os arquivos num diretório a ocorrência da palavra security.

$ grep security *

Veja o arquivo datas:

$ cat datas1978-05-11	João	1976-02-23	Maria2001-07-11	Pedro1980-05-14	Carla

Para procurar as pessoas nascidas no dia 11 usando o grep, deve-se indicar que os caracteres {  } são metacaracteres usando a contra-barra:

$ grep "^[0-9]\{4\}-[0-9]\{2\}-11" datas
1978-05-11    João
2001-07-11    Pedro

Para procurar uma ocorrência em todos os subdiretórios, utiliza-se a opção de recursividade "-r":

$ grep -r uira *

Para inverter uma procura (trazer todas as ocorrências, menos algum termo, usa-se a opção "-v".

Neste exemplo, retorna todas as linhas não comentadas do php.ini:

$ grep -v "^;" /etc/php.ini

Para listar somente as linhas com endereços de e-mail válidos:

$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

Para listar todos os endereços IPs únicos que acessaram um servidor web:

$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/nginx/access.log  | sort | uniq

É possível também usar expressões com OU para fazer buscas de mais de um termo:

$ grep -E 'carla|uira' arquivo

Vale lembrar que o grep faz distinção de maiúsculas e minúsculas. Para fazer uma busca independente se o texto está em caixa alta ou baixa, pode-se usar a opção "-i":

$ grep -i uira *

As buscas com a opção "-i" demoram mais tempo.

É possível usar as chaves para especificar ocorrências de algum caracter da busca em maiúsculo ou minúsculo:

$ grep [Uu]ira *

Para mostrar a linha de uma determinada ocorrência:

$ grep -n uira arquivo

Para mostrar uma linha antes e depois do termo, pode-se usar a opção "-C N", onde N é o número de linhas:

$ grep -C 1 function LivroSubcapituloList.php    
    public static function onChangeLivro($param = null)
    {

Comando egrep

O comando egrep funciona como a opção -E do grep.

Ele na verdade utiliza o padrão POSIX de Expressões Regulares ERE na busca. Isto significa que a contra-barra deve ser usada para definir que o próximo caractere é um caractere literal e não um metacaractere como no padrão POSIX BRE.

Isto significa que os caractes  ?  +  {  }  |   (  ) não precisam da contra-barra para funcionar como meta-caracteres.

Tome como exemplo a lista de aniversários. Com o comando grep e sem as contra-barras, o grep não e capaz de encontrar os aniversariantes de Maio:

$ grep "^[0-9]{4}-05-[0-9]{2}" datas

Já o egrep é capaz de interpretar as {  } como meta-caracteres sem a contra-barra. É importante que você guarde a diferença do uso das contra-barras entre o grep (que necessita delas para indicar metacaracteres) e o egrep (cujo efeito das contra-barras é inverso, indicando um caractere comum):

$ egrep "^[0-9]{4}-05-[0-9]{2}" datas1978-05-11	João	1980-05-14	Carla

Somente com a opção -E o grep é capaz de achar as ocorrências:

$ grep -E "^[0-9]{4}-05-[0-9]{2}" datas1978-05-11	João	1980-05-14	Carla

É muito importante você saber o que faz a contra-barra no padrão POSIX BRE x POSIX ERE.

Comando fgrep

O comando fgrep também é parecido com o grep, mas ele não suporta expressões regulares, procurando somente uma chave de busca ou um texto comum nos arquivos.

Por este motivo, é mais rápido que o grep, mas menos versátil. 

Ele é o mesmo que a opção -F do grep.

Exemplo:

$ fgrep batata *listaab:batatasupermercado:batata

Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.

Gostou? Compartilhe

Uira Ribeiro

Prof. Uirá Ribeiro

Chair do Board do Linux Professional Institute

Especialista Linux com mais de 20 anos de experiência.
Autor de 5 livros e mentor de mais de 14.000 alunos certificados.
20 certificações de alto nível, incluindo LPIC-3, CKA, RHCE e AWS Solutions Architect.

WhatsApp