Comando grep - Filtragem de Strings com Expressões Regulares - Linux
Índice:
- Sintaxe do comando Grep
- Como usar
greppara procurar uma seqüência de caracteres em arquivos - Inverter correspondência (excluir)
- Como usar o Grep para procurar uma seqüência de caracteres na saída de comando
- Pesquisa Recursiva
- Mostrar apenas o nome do arquivo
- Pesquisa não sensível a maiúsculas e minúsculas
- Pesquisar palavras completas
- Mostrar números de linha
- Contar correspondências
- Pesquisar várias seqüências de caracteres (padrões)
- Modo silencioso
- Expressão regular básica
- Expressões regulares estendidas
- Imprimir linhas antes de uma correspondência
- Imprimir linhas após uma correspondência
- Conclusão
O comando
grep
que significa “impressão de expressão regular global”, é um dos comandos mais poderosos e comumente usados no Linux.
O Grep pesquisa um ou mais arquivos de entrada por linhas que correspondem a um determinado padrão e grava cada linha correspondente na saída padrão. Se nenhum arquivo for especificado, o
grep
lê a entrada padrão, que geralmente é a saída de outro comando.
Neste tutorial, mostraremos como usar o comando
grep
através de exemplos práticos e explicações detalhadas das opções mais comuns do
grep
GNU.
Sintaxe do comando Grep
Antes de abordar como usar o comando
grep
, vamos começar revisando a sintaxe básica.
As expressões do utilitário
grep
assumem o seguinte formato:
grep PATTERN
Os itens entre colchetes são opcionais.
-
OPTIONS- Zero ou mais opções. O Grep fornece várias opções que controlam seu comportamento.PATTERN- Padrão de pesquisa.FILE- Zero ou mais nomes de arquivos de entrada.
Para poder pesquisar o arquivo, o usuário que está executando o comando deve ter acesso de leitura ao arquivo.
Como usar
grep
para procurar uma seqüência de caracteres em arquivos
O uso mais básico do comando
grep
é procurar uma string (texto) em um arquivo.
Por exemplo, para exibir as linhas do arquivo
/etc/passwd
que contém a cadeia
bash
você pode usar o seguinte comando:
grep bash /etc/passwd
A saída deve ser algo como isto:
root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Se a sequência incluir espaços, coloque-a entre aspas simples ou duplas:
grep "Gnome Display Manager" /etc/passwd
Inverter correspondência (excluir)
Para exibir as linhas que não correspondem a um padrão, use a opção
-v
(ou
--invert-match
).
Por exemplo, para exibir as linhas do arquivo
/etc/passwd
que não contêm a string
nologin
você pode usar o seguinte comando:
grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Como usar o Grep para procurar uma seqüência de caracteres na saída de comando
Em vez de especificar arquivos de entrada, você pode canalizar a saída de outro comando para
grep
e exibir apenas as linhas correspondentes a um determinado padrão.
Por exemplo, para descobrir quais processos estão em execução no seu sistema como usuário
www-data
você pode usar o seguinte comando
ps
:
ps -ef | grep www-data
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Você também pode encadear vários tubos sob comando. Como você pode ver na saída acima, também há uma linha contendo o processo
grep
. Se você não deseja que essa linha seja mostrada, passe a saída para outra instância
grep
como mostrado abaixo.
ps -ef | grep www-data | grep -v grep
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Pesquisa Recursiva
Para procurar recursivamente um padrão, use a opção
-r
(ou
--recursive
). Isso pesquisará todos os arquivos no diretório especificado, ignorando os links simbólicos encontrados recursivamente. Para seguir todos os links simbólicos, use a opção
-R
(ou
--dereference-recursive
).
No exemplo a seguir, estamos procurando a string
linuxize.com
em todos os arquivos dentro do diretório
/etc
:
grep -r linuxize.com /etc
O comando imprimirá as linhas correspondentes prefixadas pelo caminho completo para o arquivo.
/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;
Se em vez disso
-r
você usar a opção
-R
grep
seguirá todos os links simbólicos:
grep -R linuxize.com /etc
Observe a última linha da saída. Essa linha não é impressa no exemplo acima porque os arquivos dentro do diretório
sites-enabled
do Nginx são links simbólicos para arquivos de configuração dentro do diretório
sites-available
.
/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;
Mostrar apenas o nome do arquivo
Para suprimir a saída
grep
padrão e imprimir apenas os nomes dos arquivos que contêm o padrão correspondente, você pode usar a opção
-l
(ou
--files-with-matches
).
Por exemplo, para pesquisar todos os arquivos que terminam com
.conf
no diretório de trabalho atual e imprimir apenas os nomes dos arquivos que contêm a cadeia
linuxize.com
digite:
grep -l linuxize.com *.conf
A saída será mais ou menos assim:
tmux.conf haproxy.conf
A opção
-l
é geralmente usada em combinação com a opção recursiva
-R
:
Pesquisa não sensível a maiúsculas e minúsculas
Por padrão, o comando
grep
faz
grep
maiúsculas e minúsculas. Isso significa que os caracteres maiúsculos e minúsculos são tratados como distintos.
Para ignorar maiúsculas e minúsculas ao pesquisar, use a opção
-i
(ou
--ignore-case
).
Por exemplo, ao pesquisar o
Zebra
sem nenhuma opção, o seguinte comando não mostrará nenhuma saída, ou seja, existem linhas correspondentes:
grep Zebra /usr/share/words
Mas se você executar uma pesquisa sem distinção entre maiúsculas e minúsculas usando a opção
-i
, ela corresponderá às letras maiúsculas e minúsculas:
grep -i Zebra /usr/share/words
A especificação de "Zebra" corresponderá a "zebra", "ZEbrA" ou qualquer outra combinação de letras maiúsculas e minúsculas para essa sequência.
Pesquisar palavras completas
Ao procurar por "gnu", o
grep
também imprimirá as linhas em que "gnu" está incorporado em palavras maiores, como "cygnus" ou "magnum".
grep gnu /usr/share/words
cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut
Para retornar apenas as linhas em que a cadeia especificada é uma palavra inteira (delimitada por caracteres não-palavra), use a opção
-w
(ou
--word-regexp
).
az
,
AZ
e
0-9
) e sublinhados (
_
). Todos os outros caracteres são considerados caracteres que não são palavras.
grep -w gnu /usr/share/words
Mostrar números de linha
Para mostrar o número de linhas que contêm uma sequência que corresponde a um padrão, use a opção
-n
(ou
--line-number
). Ao usar esta opção, o
grep
imprimirá as correspondências na saída padrão prefixada com o número da linha em que foi encontrado.
Por exemplo, para exibir as linhas do arquivo
/etc/services
que contêm a sequência
bash
prefixada com o número da linha correspondente, você pode usar o seguinte comando:
grep -n 10000 /etc/services
A saída abaixo mostra que as correspondências são encontradas nas linhas 10423 e 10424.
10423:ndmp 10000/tcp 10424:ndmp 10000/udp
Contar correspondências
Para imprimir uma contagem de linhas correspondentes à saída padrão, use a opção
-c
(ou
--count
).
No exemplo abaixo, estamos contando o número de contas que possuem
/usr/bin/zsh
como um shell.
grep -c '/usr/bin/zsh' /etc/passwd
Pesquisar várias seqüências de caracteres (padrões)
Dois ou mais padrões de pesquisa podem ser unidos usando o operador OR
|
.
Por padrão,
grep
interpreta o padrão como uma expressão regular básica em que os meta-caracteres como
|
perdem seu significado especial e suas versões com barra invertida devem ser usadas.
No exemplo abaixo, estamos pesquisando todas as ocorrências das palavras
fatal
,
error
e
critical
no arquivo de erro de log do Nginx:
grep 'fatal\|error\|critical' /var/log/nginx/error.log
grep -E 'fatal|error|critical' /var/log/nginx/error.log
Modo silencioso
O
-q
(ou
--quiet
) diz ao
grep
para não escrever nada no terminal (saída padrão). Se uma correspondência for encontrada, o comando sairá com o status
0
. Isso é útil ao usar
grep
em scripts de shell, nos quais você deseja verificar se um arquivo contém uma string e executar uma determinada ação, dependendo do resultado.
Aqui está um exemplo de uso do
grep
em modo silencioso como um comando de teste em uma instrução
if
:
if grep -q PATTERN filename then echo pattern found else echo pattern not found fi
Expressão regular básica
O GNU Grep possui dois conjuntos de recursos de expressão regular, Básico e Estendida. Por padrão,
grep
interpreta o padrão como uma expressão regular básica.
Quando usado no modo básico de expressão regular, todos os outros caracteres, exceto os meta-caracteres, são na verdade expressões regulares que se combinam. Abaixo está uma lista dos meta-caracteres mais usados:
-
Use o símbolo
^(cursor) para corresponder à expressão no início de uma linha. No exemplo a seguir, a string^kangaroocorresponderá apenas se ocorrer no início de uma linha.grep "^kangaroo" file.txtUse o símbolo
$(dólar) para corresponder à expressão no final de uma linha. No exemplo a seguir, a cadeiakangaroo$corresponderá apenas se ocorrer no final de uma linha.grep "kangaroo$" file.txtUse o
.(período) para corresponder a qualquer caractere único. Por exemplo, para corresponder a qualquer coisa que comece comkane tenha dois caracteres e termine com a stringroo, você pode usar o seguinte padrão:grep "kan..roo" file.txtUsar
(colchetes) para corresponder a qualquer caractere entre colchetes. Por exemplo, encontre as linhas que contêmacceptou "accent, você poderia usar o seguinte padrão:grep "accet" file.txtUsar
(colchetes) para corresponder a qualquer caractere entre colchetes. O padrão a seguir corresponderá a qualquer combinação de cadeias que contenhamco(any_letter_except_l)a, comococa,cobalte assim por diante, mas não corresponderá às linhas que contêmcola,grep "coa" file.txt
Para escapar do significado especial do próximo caractere, use o símbolo
\
(barra invertida).
Expressões regulares estendidas
Para interpretar o padrão como uma expressão regular estendida, use a opção
-E
(ou
--extended-regexp
). Expressões regulares estendidas incluem todos os metacaracteres básicos, além de metacaracteres adicionais para criar padrões de pesquisa mais complexos e poderosos. Abaixo estão alguns exemplos:
-
Combine e extraia todos os endereços de email de um determinado arquivo:
grep -E -o "\b+@+\.{2, 6}\b" file.txtCombine e extraia todos os endereços IP válidos de um determinado arquivo:
grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt
A opção
-o
é usada para imprimir apenas a sequência correspondente.
Imprimir linhas antes de uma correspondência
Para imprimir um número específico de linhas antes das linhas correspondentes, use a opção
-B
(ou -
--before-context
).
Por exemplo, para exibir cinco linhas do contexto inicial antes de corresponder às linhas, você usaria o seguinte comando:
Imprimir linhas após uma correspondência
Para imprimir um número específico de linhas após as linhas correspondentes, use a opção
-A
(ou
--after-context
).
Por exemplo, para exibir cinco linhas de contexto à direita após linhas correspondentes, você usaria o seguinte comando:
Conclusão
O comando
grep
permite procurar um padrão dentro dos arquivos. Se uma correspondência for encontrada, o grep imprimirá as linhas que contêm o padrão especificado.
Há muito mais para aprender sobre o Grep na página do manual do usuário do Grep.
terminal grepO MSN aumentou sua participação no mercado de buscas nos EUA em julho, enquanto o MSN foi o maior perdedor O Google continuou a conquistar participação de mercado de buscas nos EUA em um ritmo recorde em julho, com o MSN, da Microsoft, como o maior perdedor no último ano e meio, segundo dados da Hitwise. O Google respondeu por 70,77 por cento de todas as consultas de mecanismos de pesquisa on-line nos EUA durante as quatro semanas que terminam em 26 de julho, disse a Hitwise na terça-feira. A ci
A busca MSN da Microsoft, em contraste, levou o pior atingiu nos últimos dezenove meses. O MSN representou apenas 5,36% de todas as buscas nos EUA em julho, ante 8,79% no mesmo mês do ano passado e quase metade dos 10,35% que o MSN detinha em janeiro de 2007.
A liderança inicial do Bing sobre o Yahoo não é um indicativo de como se sairá em longo prazo, dizem analistas O Bing, da Microsoft, ultrapassou o Yahoo Search em apenas quatro dias de lançamento, segundo a StatCounter, empresa de análise da Web, mas é cedo demais para dizer até que ponto o novo mecanismo de busca se comportará no longo prazo. tornou-se o segundo maior mecanismo de buscas nos EUA e no mundo, com 16,28 por cento de buscas nos 10,22 por cento do Yahoo nos EUA e 5,62 por cento no B
[Mais leitura: Os melhores serviços de streaming de TV]
Infosys adquire a empresa de BPO nos negócios de BPO da Infosys nos EUA para adquirir uma empresa de BPO nos EUA; focada no mercado de seguros e serviços financeiros
A Infosys BPO, subsidiária de terceirização de processos de negócios (BPO) da Infosys Technologies, disse na quinta-feira que assinou um acordo definitivo para adquirir todos os interesses pendentes da McCamish Systems. A empresa de BPO em Atlanta, Geórgia, concentrou-se no mercado de seguros e serviços financeiros.







