grep
O grep (Global Regular Expression Print) é uma ferramenta
utilizada para pesquisa de textos, padrões ou expressões regulares dentro de
arquivos ou fluxos de entrada (stdin). Ele imprime linhas que correspondem a uma
expressão regular fornecida.
Pesquisa em Arquivo
Para pesquisar uma string dentro de um arquivo:
$ cat frutas.txt
banana
manga
uva
melancia
abacate
$ grep "manga" frutas.txt
manga
grep "/bin/bash" /etc/passwd
Também podemos fazer isso utilizando o stdout de outro comando e passar via
stdin para o grep:
cat /etc/passwd | grep "/bin/bash"
Para exibir o número da linha onde a string foi encontrada:
$ grep "pesquisa" file -n
231 pesquisa
Podemos enviar o stdout do grep para algum arquivo:
cat /etc/passwd | grep "/bin/bash" > shell.txt
grep "/bin/bash" /etc/passwd > shell.txt
Exibir Linhas Adjacentes
Para exibir linhas acima do padrão desejado podemos utilizar o parâmetro -B
(Before) seguido da quantidade de linhas que queremos exibir antes:
$ cat frutas.txt
banana
manga
uva
melancia
abacate
$ grep "manga" -B 1 frutas.txt
banana
manga
Para exibir linhas abaixo do padrão desejados podemos utilizar o parêmetro -A
(After) seguido da quantidade de linhas que queremos exibir após:
$ grep "manga" -A 2 frutas.txt
manga
uva
melancia
Pesquisa Exata
Também podemos fazer pesquisa onde levará em questão a palavra completa e não somente um fragmento dela:
$ cat teste.txt
salada
salmão
sal
$ grep -w sal teste.txt
sal
Pesquisa em Multiplos Arquivos
Para pesquisar uma string em vários arquivos, basta passar mais de um arquivo como argumento:
grep "pesquisa" file1 file2
Eliminar Linhas
Com o grep também é possível eliminar linhas que contenham o padrão procurado
e exibir o restante do conteúdo do arquivo passado como argumento:
grep -v "nologin" /etc/passwd
Mesmo exemplo utilizando stdin:
cat /etc/passwd | grep -v "nologin"
Filtro com Multiplas Strings
Há duas formas de fazer isso, a primeira é contatenando multiplos comandos de
grep e outra é utilizando o comando grep -E ou egrep, uma variante
descontinuada porém ainda funcional.
cat /etc/passwd | grep -v "nologin" | grep -v "/bin/false"
grep -v "nologin" /etc/passwd | grep -v "/bin/false"
No exemplo do egrep utilizamos o | para separar os padrões que desejamos
pesquisar ou eliminar no stdout.
grep -v -E "nologin|/bin/false" /etc/passwd
egrep -v "nologin|/bin/false" /etc/passwd
Pesquisa Recursiva
É possível fazer uma pesquisa recursiva em um diretório:
grep -R "nologin"