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/passwd
uira: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/passwd
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
uira: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/passwd
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
wwwrun: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/passwd
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
uira:x:500:100:uira:/home/uira:/bin/bash
alias: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/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
news:x:9:13:News system:/etc/news:/bin/bash
uira: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/passwd
squid:x:31:65534:WWW-proxy squid:/var/cache/squid:/bin/false
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
alias:x:501:1000::/var/qmail:/bin/false
qmaild: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 datas
1978-05-11 João
1976-02-23 Maria
2001-07-11 Pedro
1980-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}" datas
1978-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}" datas
1978-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:batata
supermercado: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