Android

Comando grep no linux (encontre texto nos arquivos)

Comando grep - Filtragem de Strings com Expressões Regulares - Linux

Comando grep - Filtragem de Strings com Expressões Regulares - Linux

Índice:

Anonim

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 :

grep -Rl linuxize.com /tmp

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.

zebra zebra's zebras

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 ).

Os caracteres do Word incluem caracteres alfanuméricos ( 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

gnu

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

4

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 ^kangaroo corresponderá apenas se ocorrer no início de uma linha.

    grep "^kangaroo" file.txt

    Use o símbolo $ (dólar) para corresponder à expressão no final de uma linha. No exemplo a seguir, a cadeia kangaroo$ corresponderá apenas se ocorrer no final de uma linha.

    grep "kangaroo$" file.txt

    Use o . (período) para corresponder a qualquer caractere único. Por exemplo, para corresponder a qualquer coisa que comece com kan e tenha dois caracteres e termine com a string roo , você pode usar o seguinte padrão:

    grep "kan..roo" file.txt

    Usar (colchetes) para corresponder a qualquer caractere entre colchetes. Por exemplo, encontre as linhas que contêm accept ou " accent , você poderia usar o seguinte padrão:

    grep "accet" file.txt

    Usar (colchetes) para corresponder a qualquer caractere entre colchetes. O padrão a seguir corresponderá a qualquer combinação de cadeias que contenham co(any_letter_except_l)a , como coca , cobalt e assim por diante, mas não corresponderá às linhas que contêm cola , 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.txt

    Combine 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:

grep -B 5 root /etc/passwd

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:

grep -A 5 root /etc/passwd

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 grep