Usando Grep com expressões regulares

Usando Grep com expressões regulares
Este tutorial descreve como usar os dois grep (e egrep) to Encontre texto em arquivos, em sua forma simples e quando combinados com expressões regulares. Ele contém vários exemplos e exercícios, mais soluções, Para o espectador concluir.

O nome grep vem do comando ed (e vim) “g/re/p”, o que significa procurar globalmente uma determinada expressão regular e imprimir (exibir) a saída.

Regular Expressões

Os utilitários permitem que o usuário pesquise arquivos de texto por linhas que correspondam a uma expressão regular (regexp). Uma expressão regular é uma sequência de pesquisa composta de texto e um ou mais de 11 caracteres especiais. Um exemplo simples é corresponder ao início de uma linha.

Arquivo de amostra

A forma básica de grep pode ser usado para encontrar texto simples em um específico arquivo ou arquivos. Para tentar os exemplos, primeiro crie o arquivo de amostra.

Use um editor como Nano ou Vim para copiar o texto abaixo em um arquivo chamado meu arquivo.

XYZ
xyzde
Exyzd
Dexyz
d?gxyz
xxz
xzz
x \ z
x*z
xz
x z
XYZ
Xyyz
XYZ
xyyz
xyyyz
xyyyyz

Embora você possa copiar e colar os exemplos no texto (observe que as cotações duplas podem não copiar corretamente), os comandos precisam ser digitados para aprendê -los corretamente.

Antes de experimentar os exemplos, veja o arquivo de amostra:

gato myfile
XYZ
xyzde
Exyzd
Dexyz
d?gxyz
xxz
xzz
x \ z
x*z
xz
x z
XYZ
Xyyz
XYZ
xyyz
xyyyz
xyyyyz

Pesquisa simples

Para encontrar o texto 'xyz' dentro do arquivo, execute o seguinte:

grep xyz myfile
XYZ
xyzde
Exyzd
Dexyz
d?gxyz

Opções

Opções comuns usadas com o grep Comando incluir:

  • -Eu encontro todas as linhas independente de caso
  • -c contar Quantas linhas contêm o texto
  • -n linha de exibição números de linhas correspondentes
  • -l Somente exibir arquivo nomes que jogada
  • -r recursivo Pesquisa de subdiretos
  • -v Encontre todas as linhas NÃO contendo o texto

Por exemplo:

grep -i xyz myfile
# Encontre o texto independentemente do caso
XYZ
xyzde
Exyzd
Dexyz
d?gxyz
XYZ
XYZ
grep -ic xyz myfile
# contagem de linhas com texto
7
grep -in xyz myfile
# Mostrar números de linha
1: XYZ
2: XYZDE
3: Exyzd
4: Dexyz
5: d?gxyz
12: XYZ
14: XYZ

Crie vários arquivos

Antes de tentar pesquisar vários arquivos, primeiro crie vários novos arquivos:

eco xyz> myfile1
gato myfile1
XYZ
echo -e 'xyz \ nxzz \ nxyz'> myfile2
gato myfile2
XYZ
xzz
XYZ
eco -e 'xxx \ nyyy'> myFile3
gato myfile3
xxx
AAA

Pesquise vários arquivos

Para pesquisar vários arquivos usando os nomes de arquivos ou um curinga Enter:

grep -ic xyz myfile myfile1 myfile2 myfile3
MyFile: 7
MyFile1: 1
MyFile2: 2
MyFile3: 0
# combine nomes de arquivos começando com 'meu'
grep -no xyz meu*
MyFile: 1: XYZ
MyFile: 2: XYZDE
MyFile: 3: Exyzd
MyFile: 4: Dexyz
MyFile: 5: D?gxyz
MyFile: 12: XYZ
MyFile: 14: XYZ
myfile1: 1: xyz
myfile2: 1: xyz
myfile2: 3: xyz

Exercício i

  1. Primeira conta quantas linhas existem no arquivo /etc /passwd.
Dica: use wc -l /etc /passwd
  1. Agora encontre todas as ocorrências do texto var no arquivo /etc /passwd.
  2. Encontre quantas linhas no arquivo contêm o texto
  3. Encontre quantas linhas não contêm o texto var.
  4. Encontre a entrada para o seu login no /etc/passwd

Soluções de exercício podem ser encontradas no final deste artigo.

Usando expressões regulares

O comando grep Também pode ser usado com expressões regulares usando um ou mais onze caracteres especiais ou símbolos para refinar a pesquisa. Uma expressão regular é uma sequência de caracteres que inclui caracteres especiais para permitir a correspondência de padrões dentro de serviços públicos, como grep, vim e sed. Observe que as cordas podem precisar ser fechadas em cotações.

Os personagens especiais disponíveis incluem:

^ Começo de uma linha
$ Fim de uma linha
. Qualquer personagem (exceto \ n newline)
* 0 ou mais da expressão anterior
\ Preceder um símbolo o torna um caráter literal

Observe que o *, que pode ser usado na linha de comando para corresponder a qualquer número de caracteres, incluindo nenhum, é não usado da mesma maneira aqui.

Observe também o uso de citações nos seguintes exemplos.

Exemplos

Para encontrar todas as linhas começando com o texto usando o caractere ^:

grep '^xyz' myfile

Para encontrar todas as linhas que terminam com o texto usando o caractere $:

grep 'xyz $' myfile

Para encontrar linhas contendo uma string usando os caracteres ^ e $:

grep '^xyz $' myfile

Para encontrar linhas usando o . Para combinar com qualquer personagem:

grep '^x.z 'myfile

Para encontrar linhas usando o * para corresponder 0 ou mais da expressão anterior:

grep '^xy*z' myfile

Para encontrar linhas usando .* Para combinar 0 ou mais de qualquer personagem:

grep '^x.*z 'myfile

Para encontrar linhas usando o \ Para escapar do personagem *:

grep '^x \*z' myfile

Para encontrar o uso de \ caracteres:

grep '\\' myfile

Expressão grep - egrep

O grep O comando suporta apenas um subconjunto das expressões regulares disponíveis. No entanto, o comando egrep:

  • permite o uso total de todas as expressões regulares
  • pode procurar simultaneamente por mais de uma expressão

Observe que as expressões devem ser fechadas em um par de cotações.

Para procurar mais de um regex o egrep O comando pode ser escrito em várias linhas. No entanto, isso também pode ser feito usando esses caracteres especiais:

| Alternância, uma ou outra
(…) Agrupamento lógico de parte de uma expressão
egrep '(^root |^uucp |^e -mail)' /etc /passwd

Isso extrai as linhas que começam com raiz, UUCP ou e -mail do arquivo, o | símbolo significando qualquer uma das opções.

O seguinte comando irá não trabalho, embora nenhuma mensagem seja exibida, pois o básico grep O comando não suporta todas as expressões regulares:

grep '(^root |^uucp |^e -mail)' /etc /passwd

No entanto, na maioria dos sistemas Linux, o comando grep -e é o mesmo que usar egrep:

grep -e '(^root |^uucp |^e -mail)' /etc /passwd

Usando filtros

Tubulação é o processo de envio da saída de um comando como entrada para outro comando e é uma das ferramentas Linux mais poderosas disponíveis.

Os comandos que aparecem em um pipeline são frequentemente chamados de filtros, pois, em muitos casos, peneiram ou modificam a entrada passada para eles antes de enviar o fluxo modificado para saída padrão.

No exemplo a seguir, saída padrão de ls -l é passado como entrada padrão para o grep comando. Saída do grep O comando é então passado como entrada para o mais comando.

Isso exibirá apenas diretórios em /etc:

ls -l /etc | grep '^d' | mais

Os seguintes comandos são exemplos de uso de filtros:

ps -ef | grep cron
Quem | Grep KDM

Arquivo de amostra

Para experimentar o exercício de revisão, primeiro crie o seguinte arquivo de amostra.

Use um editor como Nano ou Vim para copiar o texto abaixo em um arquivo chamado pessoas:

J.Smith 25000
Pessoal e.Smith 25400
Treinamento a.Brown 27500
Treinamento c.Browen 23400
(Admin) r.Bron 30500
Bensout t.Smyth 30000
Pessoal f.Jones 25000
Treinamento* c.Evans 25500
Bensout w.POPE 30400
Adorado T.Smythe 30500
J.Maler 33000

Exercício II

  1. Exibir o arquivo pessoas e examinar seu conteúdo.
  2. Encontre todas as linhas que contêm a string Smith nas pessoas de arquivo.Dica: use o comando grep, mas lembre -se de que, por padrão, é sensível ao caso.
  3. Crie um novo arquivo, NPEOLES, contendo todas as linhas começando com a string Pessoal no arquivo de pessoas.Dica: use o comando grep com>.
  4. Confirme o conteúdo do arquivo NPEOLS, listando o arquivo.
  5. Agora anexe todas as linhas onde o texto termina com a string 500 nas pessoas de arquivo para o arquivo NPEOLS.Dica: use o comando grep com >>.
  6. Novamente, confirme o conteúdo do arquivo NPEOLS, listando o arquivo.
  7. Encontre o endereço IP do servidor que é armazenado no arquivo /etc/hosts.Dica: use o comando grep com $ (nome do host)
  8. Usar egrep para extrair do /etc/passwd Linhas de conta de arquivo contendo LP ou seu próprio ID do usuário.

Soluções de exercício podem ser encontradas no final deste artigo.

Expressões mais regulares

Uma expressão regular pode ser pensada como curingas em esteróides.

Existem onze caracteres com significados especiais: os colchetes de abertura e fechamento [], a barra de barra ., A barra vertical ou símbolo do tubo |, o ponto de interrogação ?, The Asterisk ou Star *, o sinal de plus + e o suporte redondo de abertura e fechamento . Esses personagens especiais também são chamados de metacaracters.

Aqui está o conjunto completo de caracteres especiais:

^ Começo de uma linha
$ Fim de uma linha
. Qualquer personagem (exceto \ n newline)
* 0 ou mais da expressão anterior
| Alternância, uma ou outra
[…] Conjunto explícito de caracteres para combinar
+ 1 ou mais da expressão anterior
? 0 ou 1 da expressão anterior
\ Preceder um símbolo o torna um caráter literal
Notação de quantificador explícito
(…) Agrupamento lógico de parte de uma expressão

A versão padrão de grep tem apenas suporte de expressão regular limitado. Para que todos os exemplos a seguir funcionem, use egrep em vez disso grep -e.

Para encontrar linhas usando o | Para combinar com qualquer expressão:

egrep 'xxz | xzz' myfile

Para encontrar linhas usando | Para corresponder a qualquer expressão em uma string também use ():

egrep '^x (yz | yz)' myfile

Para encontrar linhas usando [] para corresponder a qualquer personagem:

egrep '^x [yy] z' myfile

Para encontrar linhas usando [] para não corresponder a nenhum personagem:

egrep '^x [^yy] z' myfile

Para encontrar linhas usando o * para corresponder 0 ou mais da expressão anterior:

egrep '^xy*z' myfile

Para encontrar linhas usando o + para corresponder 1 ou mais da expressão anterior:

egrep '^xy+z' myfile

Para encontrar linhas usando o ? Para corresponder 0 ou 1 da expressão anterior:

egrep '^xy?z 'myfile

Exercício III

  1. Encontre todas as linhas contendo os nomes Evans ou Maler nas pessoas de arquivo.
  2. Encontre todas as linhas contendo os nomes Smith, Smyth ou Smythe nas pessoas de arquivo.
  3. Encontre todas as linhas contendo os nomes Brown, Browen ou Bron nas pessoas de arquivo.Se você tem tempo:
  4. Encontre a linha que contém a string (admin), incluindo os colchetes, nas pessoas de arquivo.
  5. Encontre a linha que contém o personagem * nas pessoas do arquivo.
  6. Combine 5 e 6 acima para encontrar as duas expressões.

Mais exemplos

Para encontrar linhas usando . e * para corresponder a qualquer conjunto de caracteres:

egrep '^xy.*z 'myfile

Para encontrar linhas usando para corresponder n número de caracteres:

egrep '^xy 3 z' myFile
egrep '^xy 4 z' myFile

Para encontrar linhas usando para combinar n ou mais vezes:

egrep '^xy 3, z' myFile

Para encontrar linhas usando para corresponder n vezes, mas não mais que M vezes:

egrep '^xy 2,3 z' myFile

Conclusão

Neste tutorial, examinamos primeiro usar grep Em sua forma simples, encontrar texto em um arquivo ou em vários arquivos. Em seguida, combinamos o texto a ser pesquisado com expressões regulares simples e depois mais complexas usando egrep.

Próximos passos

Espero que você use bem o conhecimento adquirido. Experimentar grep Comandos em seus próprios dados e lembre -se, expressões regulares, conforme descrito aqui, podem ser usadas da mesma forma em vi, sed e Awk!

Soluções de exercícios

Exercício i

Primeira conta quantas linhas existem no arquivo /etc/passwd.

wc -l /etc /passwd

Agora encontre todas as ocorrências do texto var no arquivo /etc /passwd.

grep var /etc /passwd

Encontre quantas linhas no arquivo contêm o texto var

grep -c var /etc /passwd

Encontre quantas linhas não contêm o texto var.

grep -cv var /etc /passwd

Encontre a entrada para o seu login no /etc/passwd arquivo

grep kdm /etc /passwd


Exercício II

Exibir o arquivo pessoas e examinar seu conteúdo.

pessoas de gatos

Encontre todas as linhas que contêm a string Smith no arquivo pessoas.

Grep 'Smith' People

Crie um novo arquivo, Npeople, contendo todas as linhas começando com a string Pessoal no pessoas arquivo

Grep '^Pessoas pessoais> Npeople

Confirme o conteúdo do arquivo Npeople Listando o arquivo.

Npeople de gatos

Agora anexe todas as linhas onde o texto termina com a string 500 no arquivo pessoas para o arquivo Npeople.

Grep '500 $' People >> NPEOPS

Novamente, confirme o conteúdo do arquivo Npeople Listando o arquivo.

Npeople de gatos

Encontre o endereço IP do servidor que é armazenado no arquivo /etc/hosts.

Grep $ (nome do host) /etc /hosts

Usar egrep para extrair do /etc/passwd Linhas de conta de arquivo contendo LP ou seu próprio ID de usuário.

egrep '(lp | kdm :)' /etc /passwd


Exercício III

Encontre todas as linhas contendo os nomes Evans ou Maler no arquivo pessoas.

Egrep 'Evans | Maler' People

Encontre todas as linhas contendo os nomes Smith, Smyth ou Smythe no arquivo pessoas.

egrep 'sm (i | y) o?' pessoas

Encontre todas as linhas contendo os nomes Marrom, Browen ou Bron nas pessoas de arquivo.

sobrancelha?e?n 'pessoas

Encontre a linha que contém a string (admin), incluindo os colchetes, no arquivo pessoas.

$ egrep '\ (admin \)' pessoas

Encontre a linha que contém o personagem * nas pessoas de arquivo.

pessoas de egrep '\*'

Combine 5 e 6 acima para encontrar as duas expressões.

Egrep '\ (admin \) | \*' pessoas