Magic Quadrant™ para gerenciamento de acesso privilegiado 2025: Netwrix reconhecida pelo quarto ano consecutivo. Baixe o relatório.

Plataforma
Centro de recursosBlog
Comando Grep do PowerShell

Comando Grep do PowerShell

Mar 27, 2025

O comando Unix/Linux grep é uma ferramenta de busca de texto versátil usada para análise de logs, varredura de código e diagnósticos de sistema. Suporta buscas insensíveis a maiúsculas e minúsculas, varreduras recursivas de diretórios, correspondências invertidas, números de linha e padrões avançados de regex como lookahead e lookbehind. No Windows, o Select-String do PowerShell serve como equivalente, possibilitando correspondência de padrões rápida em arquivos, fluxos e scripts de automação.

O comando Grep (Global Regular Expression Print) é uma ferramenta poderosa de busca de texto em sistemas Unix/Linux. Grep recebe um padrão, como uma expressão regular ou string, e procura em um ou mais arquivos de entrada pelas linhas que contêm o padrão esperado. O comando Grep pode ser significativamente utilizado para busca e filtragem de texto, análise de logs, varredura de código, gerenciamento de configuração, extração de dados etc. No desenvolvimento de software, a busca de texto é usada para navegação de código, refatoração, depuração, diagnóstico de erros, varredura de ameaças de segurança, controle de versão e revisão de código. Ferramentas de busca de texto podem reduzir significativamente o tempo dos desenvolvedores para encontrar funções específicas, variáveis ou mensagens de erro. Em administração de sistemas, a busca de texto é útil para tarefas como análise e monitoramento de logs, detecção de segurança e ameaças, processamento de dados e automação. Ferramentas de processamento de texto como grep, awk e sed são usadas para escanear os logs a fim de analisar eventos de autenticação, exceções específicas e filtrar logs por gravidade, carimbo de data/hora ou palavras-chave ajudam os administradores a detectar falhas, violações de segurança e problemas de desempenho. Neste blog, exploraremos de forma abrangente as funcionalidades, exemplos e casos de uso do Grep. Select-String pode ser usado como equivalente ao grep no PowerShell para windows, empregando correspondência de expressões regulares para buscar padrões de texto em arquivos e entradas.

Netwrix Auditor for Active Directory

Obtenha uma visibilidade completa do que está acontecendo no seu Active Directory

Sintaxe e Uso Básicos

O comando Grep é uma ferramenta poderosa para buscar padrões de texto para filtragem e análise de texto em Unix/Linux. Abaixo está a estrutura básica do comando, contendo padrão, arquivo e opções.

grep [options] pattern [file…]

  • Padrão: texto da expressão regular para pesquisa.
  • Arquivo: arquivo ou arquivos nos quais realizar a busca.
  • Opções: Modificadores ou interruptores que alteram o comportamento do grep. As opções geralmente são precedidas por hífen (-).

A seguir estão algumas das opções mais frequentemente utilizadas.

  • -i: ignora o tipo de caixa na pesquisa de padrões e dados. Por exemplo, o comando abaixo irá procurar por “hello”, “HELLO”, “Hello”, etc.

grep -i “hello” file.txt

  • -v: Inverte a correspondência da pesquisa, mostrando linhas que não correspondem ao padrão. Por exemplo, o comando abaixo mostrará linhas que não contêm “hello”, essa opção é útil para encontrar linhas que não atendem a um critério específico.

grep -v “hello” file.txt

  • -n: Exibe o número da linha antes de cada linha que corresponde aos critérios e ajuda no compartilhamento de relatórios. Por exemplo, o comando abaixo mostrará os números das linhas onde a palavra “function” aparece.

grep -n “function” file.txt

  • -r: Pesquise diretórios recursivamente, ou seja, procure o padrão em todos os arquivos dentro de um diretório e seus subdiretórios.
  • –color: Destaca a string correspondente na saída. Por exemplo, o comando abaixo irá destacar “hello” na saída.

grep –color “hello” file.txt

  • -l: lista apenas os nomes dos arquivos nos quais contêm pelo menos uma correspondência.

grep -l “starting” *.log

Image

Compatibilidade de Plataforma

O Grep é integrado por padrão na linha de comando em sistemas Unix/Linux e se comporta de maneira consistente como esperado. Trabalha com expressões regulares, suporta encadeamento de comandos (piping) e se integra perfeitamente com outras ferramentas Unix/Linux. O Grep está disponível em sistemas Windows através do subsistema Windows para Linux (WSL), que permite aos usuários executar ambientes GNU/Linux diretamente no Windows, sem a sobrecarga de uma máquina virtual. Existem várias portas nativas do Grep disponíveis para Windows, que são versões independentes compiladas para rodar diretamente no Windows, como o Git Bash, Gnuwin32.

Embora o grep seja projetado para ser consistente em diferentes plataformas, existem algumas diferenças e limitações das quais se deve estar ciente ao usar em diferentes plataformas.

  • Finais de Linha: Sistemas Unix/Linux usam ‘\n’ para finais de linha, enquanto o Windows usa ‘\r\n’.
  • Especificação do caminho: O comportamento do sistema de arquivos difere entre Unix/Linux e Windows, os caminhos no Windows usam barras invertidas ‘\’ em vez de ‘/’ usados no Unix/Linux.
  • Codificação de caracteres: Diferentes plataformas utilizam diferentes codificações de caracteres padrão, especialmente ao lidar com texto não ASCII.
  • Opções de linha de comando: A maioria das opções comuns do grep é suportada em diferentes plataformas, pode haver suporte limitado do grep em diferentes plataformas, como suporte limitado de encaminhamento de comandos no window.

Exemplos práticos do grep em ação

Pesquisas de Texto Simples

No exemplo a seguir, estamos procurando pela palavra “deployment” em um arquivo de log

Grep “deployment” logemail.log

Image

No exemplo a seguir, estamos procurando por uma string que comece com a opção -i que irá ignorar a diferença de maiúsculas e minúsculas.

grep -i “starting” logemail.log

Image

Enquanto se não usarmos a opção -i, a string exata será correspondida em todo o arquivo, ou seja, grep “Starting” logemail.log o comando procurará por Starting e ignorará correspondências como “starting” ou “STARTING” ou qualquer outra combinação sensível a maiúsculas e minúsculas da string “starting”.

Pesquisas Recursivas

Às vezes temos arquivos dispersos em diferentes diretórios e precisamos executar uma busca por padrões em múltiplos arquivos e diretórios. O comando grep com busca recursiva usando a opção -r juntamente com –include e –exclude oferece uma solução rápida. No comando a seguir, estamos buscando recursivamente pelo padrão “starting” em todos os arquivos .log no diretório atual e seus subdiretórios, e imprimindo apenas a primeira entrada dos arquivos de log onde o padrão é encontrado. Atualmente estamos no diretório “Documents”, onde existem subdiretórios, “office” e “project”.

grep -r “starting” –include=”*.log” -m1 –color=always

Image

No exemplo a seguir, estamos excluindo todos os arquivos de log e buscando recursivamente pela string “starting” em todos os arquivos do diretório “Documents” e seus subdiretórios.

Grep -r “starting” –exclude=”*.log”

Image

Invertendo Correspondências

Podemos usar a opção -v para inverter o resultado da pesquisa, assim podemos buscar uma string e encontrar todas as linhas que não contêm essa string. No exemplo a seguir, estamos buscando a string “starting” com a opção -v para encontrar todas as linhas que não contêm “starting”.

Grep -v “starting” logmail.log

Image

Números de Linha e Saída Contextual:

Ao procurar padrões em arquivos, é útil ter os números exatos das linhas que contêm o padrão de pesquisa e, às vezes, é melhor ter o contexto ao redor das correspondências de pesquisa, como se estivéssemos explorando um arquivo de log em busca de exceções, é melhor ter algumas linhas incluídas nos resultados da pesquisa, antes e depois da string de pesquisa. No exemplo a seguir, estamos usando a opção -n para imprimir os números das linhas junto com o padrão correspondente.

Grep -n “starting” logemail.log

Image

Usando a opção -A, podemos imprimir linhas após um resultado de correspondência, com a opção -B podemos imprimir algumas linhas antes dos resultados da correspondência e usando -C podemos imprimir algumas linhas antes e depois dos resultados da pesquisa. Nos exemplos a seguir, estamos usando -A, -B e -C para mostrar linhas antes e depois dos resultados da pesquisa.

grep -A 2 “starting” logemail.log

Image

grep -B 2 “starting” logemail.log

Image

Grep -C 1 “starting” logemail.log

Image

Usando Expressões Regulares com grep

Expressão regular é uma sequência de caracteres que define um padrão de pesquisa, são utilizados para correspondência e manipulação de strings. Algumas das expressões regulares básicas são as seguintes.

  • Ponto(.): corresponde a qualquer caractere único exceto uma nova linha, ou seja, “c.t” corresponde a cat, cot, crt, cet etc.
  • Asterisco (*): corresponde a zero ou mais ocorrências do caractere anterior, ou seja, “c*t” combina com ct, cat, caat, caaat etc.
  • Caret(^): Corresponde ao início da linha, por exemplo, ^an corresponde a an se estiver no início da linha.
  • Sinal de dólar ($): Corresponde ao final da linha, ou seja, $finished corresponde a finished se estiver no final da linha.
  • Pipe (|): o sinal de pipe no Regex funciona como um OU lógico, ou seja, (apple | banana) corresponde a apple ou banana na linha.
  • Caractere de escape (\): Escapa um caractere especial, ou seja, \. Corresponde a um ponto literal.

O Grep suporta expressões regulares; ele usa expressão regular básica (BRE) e também suporta expressão regular estendida (ERE) com a flag -E e expressões regulares compatíveis com Perl (PCERE) com a flag -P. As expressões regulares estendidas oferecem metacaracteres adicionais como + (uma ou mais correspondências), ? (zero ou uma correspondência), | (OU lógico), {} (agrupamento de padrões) para buscas de padrões mais avançadas. As expressões regulares compatíveis com Perl são as mais poderosas e flexíveis, fornecendo mais opções como lookahead (?=), lookbehinds (?<!), grupos não capturantes (?:padrão) e mais.

No exemplo a seguir, estamos encontrando uma palavra inteira em um arquivo e variação do comando grep com correspondência de string.

  • Grep “end” log.txt, corresponderá a todas as variações possíveis da palavra end
  • grep -w “end” log.txt, corresponderá apenas à palavra inteira “end”
  • grep “\bend\b” log.txt, corresponderá apenas à palavra inteira “end” usando regex.
  • Grep “\bend” log.txt, corresponderá à string “end” no início da linha.
Image

Nos exemplos a seguir, estamos correspondendo dígitos em um arquivo “log.txt” com diferentes variações.

  • grep “[0-9]” log.txt, encontrará todas as linhas que contêm algum dígito.
  • grep “[0-9]\{3\}-[0-9]\{3\}-[0-9]\{4\}” log.txt, encontrará um número de telefone no arquivo fornecido.
  • grep -E “[0-9]{2,4}” log.txt , encontrará as linhas que têm 2, 3 ou 4 dígitos consecutivos.
Image

No exemplo a seguir, estamos encontrando espaços em branco em um arquivo log.txt

  • grep “^[[:space:]]” log.txt encontrará espaços no início de uma linha.
  • grep “^[[:space:]]” log.txt vai encontrar espaços no final de uma linha.
Image

Com o comando grep podemos encontrar padrões complexos como endereços IP e e-mails. No exemplo a seguir, estamos usando uma expressão regular para encontrar endereço IP.

grep -E “\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}” log.txt

Image

No exemplo a seguir, estamos usando uma expressão regular para encontrar um endereço de e-mail.

grep -E “[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}” log.txt

Image

Técnicas avançadas de regex (por exemplo, lookahead e lookbehind com -P)

Lookahead e lookbehind são técnicas poderosas para encontrar padrões baseados nos padrões ao seu redor. Por exemplo, se quisermos procurar “erro” em um arquivo de log, mas apenas quando houver também o início de uma aplicação na linha. Existem dois tipos de lookahead, o Positive lookahead e o Negative lookahead.

  • A verificação antecipada positiva (?=…) garante que o padrão dentro dos parênteses siga a posição atual, mas não o inclua na correspondência, ou seja, poderíamos procurar por “error” se ele for imediatamente seguido pela palavra “starting” nas linhas do log.
  • A verificação negativa à frente ((?!…) garante que o padrão dentro dos parênteses não segue a posição atual, ou seja, podemos procurar pelo padrão “starting” mas não seguido pelo padrão “error”.

grep -P “error(?= starting)” log.txt

grep -P “starting(?!= error)” log.txt

Image

Existem dois tipos de lookbehind, lookbehind positivo e lookbehind negativo.

  • O lookbehind positivo ( ?<=…) garante que o padrão dentro dos parênteses preceda a posição atual, mas não é incluído na correspondência.
  • O lookbehind negativo (?<!…) garante que o padrão dentro dos parênteses não preceda a posição atual.

Grep -P “(?<=starting )error” log.txt

grep -P “error)?=.*starting)” log.txt

Image

Funcionalidades Avançadas do grep

Combinando Múltiplos Padrões

O comando Grep nos permite combinar múltiplos padrões para pesquisa também, a opção -e pode ser usada para combinar vários padrões. No exemplo a seguir, estamos pesquisando dois padrões diferentes em um único arquivo.

Grep -e “starting” -e “error” log.txt

Além disso, podemos usar -e para encontrar múltiplos padrões em múltiplos arquivos, ou seja, “starting” no arquivo log.txt e “error” em logemail.log.

grep -e “starting” -e “error” log.txt logemail.log

Image

Personalização de Saída

Podemos usar a opção –color para destacar o padrão pesquisado na saída, seja imprimindo no console ou redirecionando para um arquivo.

  • –color=auto decide se usa cor dependendo se a saída está indo para o terminal
  • –color=always, sempre use cores, mesmo se a saída estiver sendo redirecionada para um arquivo.
  • –color=never, nunca use cores.

grep –color=auto “error” log.txt

grep –color=always “error” log.txt

grep –color=never “error” log.txt

Image

Podemos usar a opção -q para modificar a saída do comando grep, para operá-lo silenciosamente. Usar a opção -q não imprimirá todas as linhas correspondentes, apenas a mensagem personalizada. Nos exemplos a seguir, estamos procurando o padrão “error” no arquivo log.txt e imprimindo “erro encontrado”.

grep -q “error” log.txt && echo “erro encontrado!” || echo “Nenhum erro encontrado”

if grep -qi “error” log.txt; then echo ” erro encontrado”; fi

Image

Otimização de Desempenho

O grep lê arquivos grandes sem carregá-los completamente na memória, no entanto, podemos melhorar seu desempenho com algumas técnicas adicionais.

  • Uso excessivo de Expressão Regular: Regex é computacionalmente caro, em cenários onde estamos procurando por uma string literal, podemos usar grep de string fixa para evitar a sobrecarga do cálculo de Regex.
  • Uso de –mmap : –mmap pode ser usado para habilitar o acesso a arquivos mapeados na memória, se estivermos realizando muitos acessos aleatórios dentro do arquivo.
  • Processamento paralelo: Se a nossa tarefa nos permitir dividir o grande arquivo e executar vários processos grep em diferentes partes, isso pode ser útil na otimização de desempenho, pois executará várias instâncias do processo grep, e podemos combinar os resultados posteriormente.
  • Limitando a saída: podemos limitar a saída para mostrar apenas a primeira ou segunda ocorrência da pesquisa ou podemos suprimir a saída e verificar apenas a existência do padrão.

O comando Grep armazena o output por padrão, o que pode atrasar o processamento em tempo real ao encadear os comandos em pipelines. A opção “--line-buffered” é usada para forçar a saída imediata para cada correspondência. No exemplo a seguir, estamos encadeando tail com grep para monitorar continuamente um arquivo de log e exibir a linha com o padrão “error” linha por linha.

Tail -f log.txt | grep –line-buffered “error”

Image

Correspondência de Padrões Baseada em Arquivos

Podemos criar um arquivo de padrões para buscar usando o comando grep e depois usar –file para buscar esses múltiplos padrões de um arquivo. No exemplo a seguir, criamos um arquivo pattern.txt contendo os padrões “starting”, “application” e “INFO” e usando –file no comando grep estamos buscando por esses padrões no arquivo logemail.log com a opção -m2 para mostrar apenas duas ocorrências.

grep –file=pattern.txt -m2 logemai.log

Image

Piping e Redirecionamento com grep

Podemos usar o comando grep encadeado com outros comandos para diferentes cenários. No comando a seguir, estamos usando o comando de status do processo (ps) para obter todos os processos e encaminhando-o com grep para imprimir apenas os processos python.

ps aux | grep python

Image

No exemplo a seguir, estamos obtendo todos os arquivos e pastas no diretório atual e filtrando apenas arquivos de log com o comando grep.

ls -a | grep ‘\.log$’

Image

No exemplo a seguir, estamos imprimindo o nome dos usuários que estão utilizando processos em python usando os comandos ps, grep e awk.

ps aux | grep python | awk ‘{print $1}’

Image

No exemplo a seguir, estamos encontrando o padrão “error” no arquivo erros.txt e usando o comando sed estamos destacando todas as ocorrências de “error” como “Alert”.

grep “error” erros.txt | sed ‘s/error/ALERT/’

Image

Nos exemplos a seguir, estamos procurando um padrão “error” no arquivo log.txt e redirecionando a saída para outro arquivo erros.txt no diretório atual. No primeiro comando, estamos sobrescrevendo a saída no arquivo errors.txt e no segundo comando estamos acrescentando a saída do grep no arquivo error.txt.

grep “error” log.txt > errors.txt

grep “error” logemail.log >> errors.txt

Image

No comando a seguir estamos usando tee para escrever a saída do grep no arquivo erros.txt enquanto também a imprimimos no console.

grep “starting” logemail.log | tee errors.txt

Image

Casos de Uso e Exemplos do Mundo Real

Análise e filtragem de arquivos de log

(dado vários exemplos acima)

Processamento de texto e extração de arquivos de dados

(dado muitos exemplos acima)

Podemos usar os comandos netstat e ss para obter o status de diferentes portas e quais processos estão ouvindo nessas portas, combinando-os com grep e também filtrando especificamente para portas específicas. Nos exemplos a seguir, estamos usando os comandos netstat e ss para obter todos os processos que estão ouvindo em diferentes portas.

netstat -lntp | grep “LISTEN”

Image

ss -lntp | grep “LISTEN”

Image

Podemos usar o comando grep com outros comandos para obter informações do sistema e pesquisar rapidamente diferentes configurações. Nos exemplos a seguir, estamos verificando diferentes informações do sistema que são úteis para fins de diagnóstico.

ps aux | grep “CPU” # para verificar as estatísticas da CPU.

df -h | grep “/dev/sd” # para verificar o uso do disco.

ip a | grep “inet” # para encontrar os endereços IP

Image

Personalizando e criando aliases para grep

Podemos definir aliases para o comando grep com suas diferentes opções e usar esses Aliases em vez do comando grep com opções para buscar padrões.

alias g=’grep’

alias gi=’grep -i’

alias gr=’grep -r’

alias gc=’gr -n –color=auto’

Após definir esses aliases, podemos usar os aliases para fazer busca de padrões apenas com aliases.

g “error” -m1 log.txt

gi “error” -m1 log.txt

gr “error” -m1 log.txt

gc “error” -m1 log.txt

Image

Podemos escrever uma função para ler os primeiros 10 registros do sistema. No exemplo a seguir, estamos escrevendo uma função “find_error” para ler o arquivo de registro do sistema no local “/var/log/systemlog” e exibir as últimas 10 linhas que contêm o padrão “error”.

find_errors{

grep -I “error” /var/log/syslog | tail -n 10

}

Encontrar_erros

Image

Estamos usando os comandos tail, grep e tee para procurar por syslog e filtrar erros com a palavra-chave “error”, exibindo o resultado no console e adicionando-o a um arquivo de log.

tail -f /var/log/syslog | grep –line-buffered -i “error” | tee errors.txt

Image

Integração com Shell Scripting (Usando grep com declarações condicionais e loops)

Exemplos de uso do grep dentro de scripts shell para automação

(Esta seção é bastante complexa e requer mais VMs e configuração do Windows com Linux, não tive tempo de compartilhar exemplos, aconselho a alterar o H2 para “Usando grep com declarações condicionais e loops”)

No exemplo a seguir, estamos usando grep -i para procurar um padrão específico e encaminhando a saída para um loop while que, então, processa cada linha correspondente.

#!/bin/bash

LOG_FILE=”/var/log/syslog”

PATTERN=”autenticação”

grep -i “$PATTERN” “$LOG_FILE” | while read -r line; do

echo “Processando linha: $line”

# Realize processamento adicional aqui

feito

Image

No exemplo a seguir, estamos usando instruções condicionais com os comandos ps e grep para verificar o status de um serviço se está em execução ou não.

#!/bin/bash

SERVICE=”CUPS”

if ! ps aux | grep -v grep | grep -q “$SERVICE”; then

echo ” $SERVICE não está em execução!”

senão

echo “$SERVICE está em execução.”

fi

Image

Solução de Problemas e Armadilhas Comuns

Superando problemas de codificação

Incompatibilidades de codificação podem fazer com que o comando grep falhe ao procurar padrões em caracteres de codificações diferentes. Podemos definir a localidade (LC_ALL=C) ou usar a opção –encoding para corrigir problemas de codificação.

Tratamento de caracteres especiais e escaping

Expressões regulares utilizam caracteres especiais que precisam ser escapados para serem usados em seu sentido literal. A barra invertida (\) é usada para escapar esses caracteres ou podemos usar a opção -F (string fixa) para tratar os padrões como strings literais.

Depuração de padrões complexos de regex

Expressões regulares complexas podem ser desafiadoras às vezes quando não retornam resultados de acordo com o cenário desejado, dividindo-as em partes pequenas e testando-as uma a uma e depois combinando-as pode economizar tempo e identificar o problema também.

Conclusão

Cobrimos muito sobre o comando grep, desde a funcionalidade básica até técnicas avançadas como expressões regulares, diferentes opções do comando grep, encadeamento do grep com outros comandos, redirecionamento de saída, script e técnicas de resolução de problemas. Assim como qualquer outra técnica do PowerShell, a prática e a experimentação com o comando grep melhorarão o entendimento e podem desbloquear possibilidades ocultas de dominar a automação de sistemas.



Compartilhar em

Saiba Mais

Sobre o autor

Asset Not Found

Tyler Reese

VP de Gestão de Produto, CISSP

Com mais de duas décadas na indústria de segurança de software, Tyler Reese tem um conhecimento íntimo dos desafios de identidade e segurança que evoluem rapidamente e com os quais as empresas se deparam hoje. Atualmente, ele atua como diretor de produto para o portfólio de Netwrix Identity and Access Management, onde suas responsabilidades incluem avaliar tendências de mercado, definir a direção para a linha de produtos IAM e, em última análise, atender às necessidades dos usuários finais. Sua experiência profissional varia desde consultoria em IAM para empresas Fortune 500 até atuar como arquiteto empresarial de uma grande empresa de venda direta ao consumidor. Atualmente, ele possui a certificação CISSP.