O nome grep vem do comando ed (e vim) “g / re / p”, 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 grep pode ser usado para encontrar texto simples dentro de um determinado arquivo ou arquivos. 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.
xyzxyzde
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 corretamente.
Antes de tentar os exemplos, veja o arquivo de amostra:
$ cat meuarquivo
Pesquisa Simples
Para localizar o texto 'xyz' dentro do arquivo, execute o seguinte:
$ grep xyz meuarquivo
Usando Cores
Para exibir cores, use -color (um hífen duplo) ou simplesmente crie um alias. Por exemplo:
$ grep --color xyz meuarquivoou
$ alias grep = 'grep --color'$ grep xyz meuarquivo
Opções
Opções comuns usadas com o grep 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
- -Eu apenas exibo Arquivo nomes que jogada
- -r recursivo pesquisa de subdiretórios
- -v encontrar todas as linhas NÃO contendo o texto
Por exemplo:
$ grep -i xyz meuarquivo # localizar texto independentemente do caso$ grep -ic xyz meuarquivo # contar linhas com texto
$ grep -in xyz meuarquivo # mostra os números das linhas
Crie vários arquivos
Antes de tentar pesquisar vários arquivos, primeiro crie vários novos arquivos:
$ echo xyz> meuarquivo1$ echo -e “xyz \ nxzz \ nXYZ”> meuarquivo2
$ echo -e “xxx \ nyyy”> meuarquivo3
$ cat meuarquivo1
$ cat meuarquivo2
$ cat meuarquivo3
Pesquisar vários arquivos
Para pesquisar vários arquivos usando nomes de arquivo ou um caractere curinga, digite:
$ grep -ic xyz meuarquivo meuarquivo1 meuarquivo2 meuarquivo3$ grep -in xyz my *
# corresponde a nomes de arquivo começando com 'meu'
Exercício I
- Primeiro conte quantas linhas existem no arquivo / etc / passwd.
- Agora encontre todas as ocorrências do texto var no arquivo / etc / passwd.
- Descubra quantas linhas no arquivo contêm o texto
- Descubra quantas linhas NÃO contêm o texto var.
- Encontre a entrada para o seu login no / etc / passwd
As soluções de exercícios 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 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 grep, 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 ^:
$ grep '^ xyz' meuarquivoPara encontrar todas as linhas que terminam com texto usando o caractere $:
$ grep 'xyz $' meuarquivoPara encontrar linhas contendo uma string usando os caracteres ^ e $:
$ grep '^ xyz $' meuarquivoPara encontrar linhas usando o . para combinar com qualquer personagem:
$ grep '^ x.z 'meuarquivo
Para encontrar linhas usando * para corresponder a 0 ou mais da expressão anterior:
$ grep '^ xy * z' meuarquivoPara encontrar linhas usando .* para corresponder a 0 ou mais de qualquer caractere:
$ grep '^ x.* z 'meuarquivoPara encontrar linhas usando o \ para escapar do caractere *:
$ grep '^ x \ * z' meuarquivoPara encontrar o \ caractere, use:
$ grep '\\' meuarquivo
Expressão grep - egrep
O grep 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 um par de aspas.
Para usar cores, use -color ou crie novamente um alias:
$ alias 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 |
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 grep comando não suporta todas as expressões regulares:
$ grep '(^ root | ^ uucp | ^ mail)' / etc / passwdNo entanto, na maioria dos sistemas Linux, o comando grep -E é o mesmo que usar egrep:
$ grep -E '(^ root | ^ uucp | ^ mail)' / etc / passwd
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 são frequentemente 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 grep comando. Saída do grep comando é então passado como entrada para o mais comando.
Isso exibirá apenas os diretórios em / etc:
$ ls -l / etc | grep '^ d' | mais
Os comandos a seguir são exemplos de uso de filtros:
$ ps -ef | grep cron$ who | grep kdm
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:
J pessoal.Smith 25000E pessoal.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
Térreo.Smythe 30500
J pessoal.Maler 33000
Exercício II
- Exibir o arquivo pessoas e examinar seu conteúdo.
- Encontre todas as linhas que contêm a string Smith no arquivo pessoas.Dica: use o comando grep, mas lembre-se de que, por padrão, diferencia maiúsculas de minúsculas.
- 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>.
- Confirme o conteúdo do arquivo npeople listando o arquivo.
- 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 >>.
- Novamente, confirme o conteúdo do arquivo npeople listando o arquivo.
- Encontre o endereço IP do servidor que está armazenado no arquivo / etc / hosts.Dica: use o comando grep com $ (hostname)
- 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 de 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 grep tem apenas suporte limitado de expressão regular. 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' meuarquivoPara encontrar linhas usando | para corresponder a qualquer uma das expressões dentro de uma string, use ():
$ egrep '^ x (Yz | yz)' meuarquivo
Para encontrar linhas usando [] para corresponder a qualquer caractere:
$ egrep '^ x [Yy] z' meuarquivoPara encontrar linhas usando [] para NÃO corresponder a nenhum caractere:
$ egrep '^ x [^ Yy] z' meuarquivoPara 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' meuarquivoPara encontrar linhas usando o ? para corresponder a 0 ou 1 da expressão anterior:
$ egrep '^ xy?z 'meuarquivo
Exercício III
- Encontre todas as linhas que contêm os nomes Evans ou Maler no arquivo pessoas.
- Encontre todas as linhas que contêm os nomes Smith, Smyth ou Smythe no arquivo pessoas.
- Encontre todas as linhas que contêm os nomes Brown, Browen ou Bron no arquivo pessoas.Se você tem tempo:
- Encontre a linha que contém a string (admin), incluindo os colchetes, no arquivo pessoas.
- Encontre a linha que contém o caractere * no arquivo pessoas.
- 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 'meuarquivoPara 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' meuarquivoPara 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 grep em sua 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 grep comandos em seus próprios dados e lembre-se, as 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
Primeiro conte 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
Descubra quantas linhas no arquivo contêm o texto var
Descubra quantas linhas NÃO contêm o texto var.
grep -cv var / etc / passwdEncontre a entrada para o seu login no / etc / passwd Arquivogrep kdm / etc / passwd
Exercício II
Exibir o arquivo pessoas e examinar seu conteúdo.$ cat pessoas
Encontre todas as linhas que contêm a string Smith no arquivo pessoas.$ grep 'Smith' pessoas
Crie um novo arquivo, npessoas, contendo todas as linhas que começam com a string Pessoal no pessoas Arquivo$ grep '^ Pessoal' pessoas> npessoas
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 $' pessoas >> npessoas
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 Maler no arquivo pessoas.$ egrep 'Evans | Maler' pessoas
Encontre todas as linhas que contêm os nomes Smith, Smyth ou Smythe no arquivo pessoas.$ egrep 'Sm (i | y) o?' pessoas
Encontre todas as linhas que contêm os nomes Castanho, Browen ou Bron no arquivo pessoas.$ egrep 'Brow?e?n 'pessoas
Encontre a linha que contém a string (admin), incluindo os colchetes, no arquivo pessoas.
Encontre a linha que contém o personagem * no arquivo pessoas.$ egrep '\ *' pessoas
Combine 5 e 6 acima para encontrar ambas as expressões.