Usando grep (e egrep) com expressões regulares

Using Grep With Regular Expressions



Este tutorial descreve como usar ambos pegada (e egrep) t o encontrar texto em arquivos, em sua forma simples e quando combinados com expressões regulares. Contém vários exemplos e exercícios , mais soluções , para que o visualizador conclua.

O nome pegada vem do comando ed (e vim) g / re / p, o que significa pesquisar globalmente por uma dada expressão regular e imprimir (exibir) a saída.







Regular Expressões

Os utilitários permitem ao usuário pesquisar arquivos de texto em busca de linhas que correspondam a uma expressão regular ( regexp ) Uma expressão regular é uma string de pesquisa composta de texto e um ou mais de 11 caracteres especiais. Um exemplo simples é combinar o início de uma linha.



Arquivo de amostra

A forma básica de pegada pode ser usado para localizar texto simples em um ou mais arquivos específicos. Para experimentar os exemplos, primeiro crie o arquivo de amostra.



Use um editor como o 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 aspas duplas podem não ser copiadas corretamente), os comandos precisam ser digitados para aprendê-los adequadamente.

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



$gatomeu arquivo

Busca Simples

Para localizar o texto ‘xyz’ dentro do arquivo, execute o seguinte:

$pegadaxyz meuarquivo

Usando Cores

Para exibir cores, use –color (um hífen duplo) ou simplesmente crie um apelido. Por exemplo:

$pegada --corxyz meuarquivo

ou

$apelido pegada= ’pegada--cor'
$pegadaxyz meuarquivo

Opções

Opções comuns usadas com o pegada comando inclui:

  • -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 exibir apenas Arquivo nomes que jogada
  • -r recursivo pesquisa de subdiretórios
  • -v encontra todas as linhas NÃO contendo o texto

Por exemplo:

$pegada -euxyz meuarquivo# localizar texto independentemente do caso

$pegada -icxyz meuarquivo# contar linhas com texto

$pegada -noxyz meuarquivo# mostrar números de linha

Crie vários arquivos

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

$jogou foraxyz>meuarquivo1
$jogou fora -Exyz nxzz nXYZ>meuarquivo2
$jogou fora -Exxx nyyy>meuarquivo3
$gatomeuarquivo1
$gatomeuarquivo2
$gatomeuarquivo3

Pesquisar vários arquivos

Para pesquisar vários arquivos usando nomes de arquivo ou um caractere curinga, digite:

$pegada -icxyz meuarquivo meuarquivo1 meuarquivo2 meuarquivo3
$pegada -noxyz meu*
# corresponde a nomes de arquivo começando com 'meu'

Exercício I

  1. Primeiro conte quantas linhas existem no arquivo / etc / passwd.
Dica: usebanheiro -a /etc/senha
  1. Agora encontre todas as ocorrências do texto Onde no arquivo / etc / passwd .
  2. Descubra quantas linhas no arquivo contêm o texto
  3. Descubra quantas linhas NÃO contêm o texto Onde .
  4. Encontre a entrada para o seu login no / etc / passwd

As soluções para exercícios podem ser encontradas no final deste artigo.

Usando expressões regulares

O comando pegada também pode ser usado com expressões regulares usando um ou mais dos onze caracteres ou símbolos especiais para refinar a pesquisa. Uma expressão regular é uma string de caracteres que inclui caracteres especiais para permitir a correspondência de padrões em utilitários como pegada , vim e sed . Observe que as strings podem precisar ser colocadas entre aspas.

Os caracteres especiais disponíveis incluem:

^ Início de uma linha
$ Fim de linha
. Qualquer caractere (exceto n nova linha)
* 0 ou mais da expressão anterior
Preceder um símbolo torna-o um caractere 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 forma aqui.

Observe também o uso de aspas nos exemplos a seguir.

Exemplos

Para localizar todas as linhas que começam com texto usando o caractere ^:

$pegada‘^ Xyz’ meuarquivo

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

$pegada‘Xyz $’ meuarquivo

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

$pegada‘^ Xyz $’ meuarquivo

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

$pegada‘^ X.z’ meuarquivo

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

$pegada‘^ Xy*z 'meuarquivo

Para encontrar linhas usando. * Para corresponder a 0 ou mais de qualquer caractere:

$pegada‘^ X.*z 'meuarquivo

Para encontrar linhas usando o para escapar do caractere *:

$pegada‘^ X *z 'meuarquivo

Para encontrar o caractere, use:

$pegada'\' meu arquivo

Expressão grep - egrep

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

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

Observe que as expressões devem ser colocadas entre aspas.

Para usar cores, use –color ou crie novamente um alias:

$apelido egrep='egrep --color'

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

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

Isso extrai as linhas que começam com root, uucp ou mail do arquivo, o | símbolo que significa qualquer uma das opções.

O seguinte comando irá não funcionar, embora nenhuma mensagem seja exibida, uma vez que o básico pegada comando não suporta todas as expressões regulares:

$pegada '(^ root | ^ uucp | ^ mail)' /etc/senha

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

$pegada -E '(^ root | ^ uucp | ^ mail)' /etc/senha

Usando Filtros

Tubulação é o processo de enviar a 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 costumam ser chamados de filtros, pois, em muitos casos, eles filtram ou modificam a entrada passada a eles antes de enviar o fluxo modificado para a saída padrão.

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

Isso exibirá apenas os diretórios em / etc :

$ls -a /etc|pegada‘^ D’|mais

Os comandos a seguir são exemplos de uso de filtros:

$ps -ef|pegadacron

$quem|pegadakdm

Arquivo de amostra

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

Use um editor como o nano ou vim para copiar o texto abaixo em um arquivo chamado pessoas:

Pessoal J.Smith 25000
Personal E.Smith 25400
Treinamento A. Brown 27500
Treinamento C.Browen 23400
(Admin) R.Bron 30500
Goodsout T.Smyth 30000
Pessoal F.Jones 25000
treinamento * C.Evans 25500
Goodsout W.Pope 30400
Andar T.Smythe 30500
Pessoal J.Maler 33000

Exercício II

  1. Exibir o arquivo pessoas e examine seu conteúdo.
  2. Encontre todas as linhas que contêm a string Smith no arquivo people.Hint: use o comando grep, mas lembre-se que, por padrão, ele diferencia maiúsculas de minúsculas.
  3. Crie um novo arquivo, npeople, contendo todas as linhas que começam com a string Pessoal no arquivo de pessoas. Dica: use o comando grep com>.
  4. Confirme o conteúdo do arquivo npeople listando o arquivo.
  5. Agora anexe todas as linhas onde o texto termina com a string 500 no arquivo pessoas para o arquivo npeople. Dica: use o comando grep com >>.
  6. Novamente, confirme o conteúdo do arquivo npeople listando o arquivo.
  7. Encontre o endereço IP do servidor que está armazenado no arquivo / etc / hosts .Dica: use o comando grep com $ (hostname)
  8. Usar egrep para extrair do / etc / passwd linhas de conta de arquivo contendo LP ou o seu próprio ID do usuário .

As soluções para exercícios podem ser encontradas no final deste artigo.

Mais expressões regulares

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

Existem onze caracteres com significados especiais: os colchetes de abertura e fechamento [], a barra invertida , o circunflexo ^, o cifrão $, o ponto ou ponto., A barra vertical ou o símbolo de barra vertical |, o ponto de interrogação?, O asterisco ou estrela *, o sinal de mais + e os colchetes de abertura e fechamento {}. Esses caracteres especiais também são chamados de metacaracteres.

Aqui está o conjunto completo de caracteres especiais:

^ Início de uma linha
$ Fim de linha
. Qualquer caractere (exceto n nova linha)
* 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 torna-o um caractere literal
{…} Notação quantificadora explícita
(…) Agrupamento lógico de parte de uma expressão

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

Para encontrar linhas usando o | para corresponder a uma das expressões:

$egrep‘Xxz|xzz ’meuarquivo

Para encontrar linhas usando | para corresponder a qualquer uma das expressões dentro de uma string, também use ():

$egrep‘^ X(Yz|sim)' meu arquivo

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

$egrep‘^ X[Yy]z 'meuarquivo

Para encontrar linhas usando [] para NÃO corresponder a nenhum caractere:

$egrep‘^ X[^ Yy]z 'meuarquivo

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

$egrep‘^ Xy*z 'meuarquivo

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

$egrep‘^ Xy + z’ meuarquivo

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

$egrep‘^ Xy? Z’ meuarquivo

Exercício III

  1. Encontre todas as linhas que contêm os nomes Evans ou pintor no arquivo pessoas.
  2. Encontre todas as linhas que contêm os nomes Smith, Smyth ou Smythe no arquivo pessoas.
  3. Encontre todas as linhas que contêm os nomes Brown, Browen ou Fonte no arquivo pessoas. Se você tiver tempo:
  4. Encontre a linha que contém a string (admin), incluindo os colchetes, no arquivo pessoas.
  5. Encontre a linha que contém o caractere * no arquivo pessoas.
  6. Combine 5 e 6 acima para encontrar ambas as expressões.

Mais exemplos

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

$egrep‘^ Xy.*z 'meuarquivo

Para encontrar linhas usando {} para corresponder ao número N de caracteres:

$egrep‘^ Xy{3}z 'meuarquivo
$egrep‘^ Xy{4}z 'meuarquivo

Para encontrar linhas usando {} para corresponder N ou mais vezes:

$egrep‘^ Xy{3,}z 'meuarquivo

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

$egrep‘^ Xy{2,3}z 'meuarquivo

Conclusão

Neste tutorial, vimos primeiro como usar pegada na forma simples de encontrar texto em um arquivo ou em vários arquivos. Em seguida, combinamos o texto a ser pesquisado com expressões regulares simples e, em seguida, outras mais complexas usando egrep .

Próximos passos

Espero que você faça bom uso do conhecimento adquirido aqui. Experimentar pegada comandos em seus próprios dados e lembre-se, as expressões regulares conforme descrito aqui podem ser usadas da mesma forma em nós , sed e awk !

Soluções de exercícios

Exercício I

Primeiro conte quantas linhas existem no arquivo / etc / passwd .
$ wc -l /etc/passwd
Agora encontre todas as ocorrências do texto Onde no arquivo / etc / passwd.
$ grep var /etc/passwd
Descubra quantas linhas no arquivo contêm o texto Onde

pegada -cOnde/etc/senha

Descubra quantas linhas NÃO contêm o texto Onde .

pegada -cvOnde/etc/senha

Encontre a entrada para o seu login no / etc / passwd Arquivo
grep kdm /etc/passwd

Exercício II

Exibir o arquivo pessoas e examine seu conteúdo.
$ cat people
Encontre todas as linhas que contêm a string Smith no arquivo pessoas .
$ grep 'Smith' people
Crie um novo arquivo, npessoas , contendo todas as linhas que começam com a string Pessoal no pessoas Arquivo
$ grep '^Personal' people> npeople
Confirme o conteúdo do arquivo npessoas listando o arquivo.
$ cat npeople
Agora anexe todas as linhas onde o texto termina com a string 500 no arquivo pessoas para o arquivo npessoas .
$ grep '500$' people>>npeople
Novamente, confirme o conteúdo do arquivo npessoas listando o arquivo.
$ cat npeople
Encontre o endereço IP do servidor que está armazenado no arquivo / etc / hosts .
$ grep $(hostname) /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 que contêm os nomes Evans ou pintor no arquivo pessoas .
$ egrep 'Evans|Maler' people
Encontre todas as linhas que contêm os nomes Smith , Smyth ou Smythe no arquivo pessoas .
$ egrep 'Sm(i|y)the?' people
Encontre todas as linhas que contêm os nomes marrom , Browen ou Fonte no arquivo pessoas.
$ egrep 'Brow?e?n' people
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 * no arquivo pessoas.
$ egrep '*' people
Combine 5 e 6 acima para encontrar ambas as expressões.

$egrep ' (Admin ) | *'pessoas