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
Tag:/dev, bash, certificação, certificaçãolinux, code, Comptia, developer, empreendedorismo, exame, freesoftware, gnu, hack, Linux, linuxfan, linuxfun, linuxmint, lovelinux, LPI, LPIC, management, nerd, opensource, php, prova, shell, software, softwarelivre, sql, tech, ti, unix