Pular para o conteúdo

Grep em loop infinito

Realiza um grep infinito em um arquivo, útil para se acompanhar um log de alguma ferramenta.

Exemplo de uso:

$ chmod 777 filtro
$ ./filtro  "LOGIN" /var/log/messages 6

LOGIN = padrão para buscar no arquivo
/var/log/messages = arquivo para fazer a pesquisa
6 = tempo para atualização
Evaldo Avelar Marques evaldoavelar
Hits: 10.157 Categoria: Shell Script Subcategoria: Variáveis
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Realiza um grep infinito em um arquivo, útil para se acompanhar um log de alguma ferramenta.

Exemplo de uso:

$ chmod 777 filtro
$ ./filtro  "LOGIN" /var/log/messages 6

LOGIN = padrão para buscar no arquivo
/var/log/messages = arquivo para fazer a pesquisa
6 = tempo para atualização
Download filtro Enviar nova versão

Versões atualizadas deste script

Esconder código-fonte

#######################################
##  Grep infinito
##
## Descricao:
## realiza um grep infinito em um arquivo, util para se acompanhar
## um log de alguma ferramenta
## Trabalha em loop infinito, para sair tecle control-c
##
## Entradas: palavra - arquivo - tempo de atualizacao
## Saidas: linhas com o padrap  na saida padrao
##
## autor: Evaldo Avelar Marques agosto - 2009
## versao: 1.0
##
########################################
#!/bin/bash

        #verifica o padrao
        if [ -z $1 ]; then
                echo "Padrao não foi informado! ";
                 exit 2;
        else
                padrao=$1;
        fi

        #verifica o arquivo
        if [ -z $2 ];then
                echo "Arquivo  nao foi informado! ";
                exit 2;
        #checa se o arquivo existe
        elif [ ! -f $2 ] ;then
                echo "Arquivo nao existe! "
                exit 2;
        #checa se arquivo esta vazio
        elif [ ! -s $2 ] ;then
                echo "Arquivo esta vazio! "
                exit 2;
        else
                log=$2;
        fi

        #verifica o contador de tempo
        if [ -z $3 ];then
                tmp=5;
        else
                tmp=$3;
        fi

        while : ;
        do
                grep  $padrao $log ;
                sleep $tmp;
        done;


############### Fim ##########################3

Tempo e temperatura local no terminal

Usando variáveis em shell script

calculadora

Criação de maquinas no SAMBA

Bloquear contas em servidor Zimbra após 45 dias

#1 Comentário enviado por neyfrota em 31/08/2009 - 04:59h
cara.. eu nao testei nao... mas... se entrar uma linha com LOGIN no arquivo.. pelo que percebi... vai ficar sendo cuspida na tela de 6 em 6 segundos... fora que ta "grepando" o arquivo inteiro de 6 em 6 segundos... em arquivos grandes isso vai ser um terror. Melhor dar um tail e "pipar" pra um grep... assim fica em tempo real....

tail -f <ARQUIVO> | grep <PADRAO>

mas posso ta errado : )
#2 Comentário enviado por cenoura em 31/08/2009 - 08:26h
Este script não gera muito I/O para arquivos muito grandes ao ficar rodando um grep nele todo a cada 6 segundos?
Acredito que a sugestão do comentário [1] (o "tail -f arquivo|grep padrao") é uma solução melhor e que é atualizada num tempo menor que os 6 segundos.
#3 Comentário enviado por evaldoavelar em 31/08/2009 - 08:59h
Isso mesmo!

Vocês estão certos, é porque no meu caso precisa ver realmente uma grande parte do arquivo.
Vou modificar para a sugestão de vocês!

Obrigado.
#4 Comentário enviado por neyfrota em 31/08/2009 - 17:20h
faz assm:

- bota o seu programa, pra receber <ARQUIVO> e <PADRAO>
- faz ele verificar arquivo e padrao
- manda ele dar um greep no <arquivo> como <padrao> (mostrar o passado)
- inicia tail-f com pipe pro grep <padrao> (passa mostrar presente e futuro)

por seguranca... o primeiro grep (do passado) tasca em vez de grep puro (que vai ver o arquivo todo... o que vai ser terrivel nos logs grandoes de 25mb) ... anda com tail tb.. mais lendo seila.. (um chute) ... as ultimas 10.000 linas....
tail -n 10000 <ARQUIVO> | grep <PADRAO>

assim quando chamar o programa.. ele olha no passado (ate 10.000 linhas no passado) e passa a verificar em tempo real (tail -f) ... assim fica realmente pratico...
#5 Comentário enviado por neyfrota em 31/08/2009 - 17:35h
mas isso tudo tb se resume a um comando so: hehehe
tail -n 10000 -f <ARQUIVO> | grep <PADRAO>

mesmo usando multiplos arquivos
tail -n 10000 -f <ARQUIVO1> <ARQUIVO2> | grep <PADRAO>
#6 Comentário enviado por evaldoavelar em 31/08/2009 - 18:11h
Sugestão acatada!

Contribuir com comentário

Entre na sua conta para comentar.