De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

Pesquisa de arquivos por conteúdo com os comandos find e grep

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 2 de dezembro de 2022

Suponhamos que você precise encontrar arquivos que possuem uma determinada nomenclatura, e uma vez encontrados, pesquisar seu conteúdo para buscar por um determinado texto.

Podemos combinar os comandos find para localizar os arquivos desejados, e o comando grep ou zgrep (arquivos compactados) para investigar seu conteúdo em busca do texto desejado.

find [ponto inicial da busca] -name [nome do arquivo ou regex] -exec zgrep -H "[texto]" {} \;

Por exemplo, para investigar todos os arquivos de log do servidor da Dicas-L para saber quantos acessos foram feitos à dica de nome esta_pessoa_nao_existe.php, que é um texto sobre a construção de faces com inteligência artificial, emitimos o seguinte comando:

$ sudo find /var/log -name '*.log' -exec grep -H 'esta_pessoa_nao_existe.php' {}\;

Como o apache compacta os arquivos de log para reduzir o uso de espaço em disco, e atribui a eles uma numeração, podemos extender a pesquisa a estes arquivos com o seguinte comando:

$ sudo find . -name '*.log' -o -name '*.log.*.gz' -exec zgrep -H 'esta_pessoa_nao_existe.php' {} \;

Neste último comando usei o comando zgrep pois alguns dos arquivos estão compactados e comando grep normal não consegue ler o conteúdo dos arquivos. O comando zgrep, por sua vez, também consegue ler o conteúdo de arquivos não compactados.

A opção -H dos comandos grep e zgrep faz com que o nome do arquivo onde foi encontrado o texto pesquisado seja inserido no começo da linha.

O que acontece nesse comando? O comando find localiza os arquivos que atendem ao critério especificado (*.log e *.log.*.gz). Por meio da diretiva -exec o comando zgrep|grep recebe como entrada, por meio das chaves ({}) o nome desses arquivos.

$ sudo find . -name '*.log' -o -name '*.log.*.gz' -exec zgrep -H 'esta_pessoa_nao_existe.php' {} \;
dicas-l.access.log:52.213.28.186 - - [02/Dec/2022:21:18:05 -0300] "GET /arquivo/esta_pessoa_nao_existe.php HTTP/1.1" 200 9976 "-" "ias-ir/3.1 (+https://www.admantx.com/service-fetcher.html)"

Se eu quiser apenas contar quantas vezes esse arquivo foi acessado, basta acrescentar o comando wc -l ao final:

$ sudo find . -name '*.log' -o -name '*.log.*.gz' -exec zgrep -H 'esta_pessoa_nao_existe.php' {} \; | wc -l
852

Esta página do meu site já foi acessada até agora 852 vezes. 😉

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rubens Queiroz de Almeida