Script para filtrar erro

1. Script para filtrar erro

Rodrigo
rodrigofl20

(usa Linux Mint)

Enviado em 19/07/2016 - 12:23h

Pessoal, preciso de um script que pesquise uma palavra em um arquivo, este arquivo é atualizado a cada segundo o script vai rodar a cada 1 min.
Sempre que na últimas 100 linhas ele encontrar a palavra "ORA-" ele deve me retornar a linha que ele achou, essa linha vai ser comparada já em um arquivo de exceções, ou seja, se a linha que contém a palavra "ORA-" existir no arquivo de exceção o script deve ignorar, mas deve me retornar a linha com o erro se a mesma não existir no arquivo de exceção.

Abaixo segue o que eu fiz até agora. A lógica creio que é mais ou menos essa, porém nesse caso ai ele está me retornando sempre o
echo "CONTÉM ERROS" 
porém eu adicionei o único erro que está aparecendo em $LIN_ERR, ao arquivo de exceção, não era pra me retornar o echo que diz "contém".

SID=orcl
DIR_ALERT=/home/lopes
LIN_ERR=$(tail -n100 $DIR_ALERT/alert_$SID.log | grep -i "ORA-")
EXCEPTION=$(cat /home/lopes/teste.txt)

if [[ $EXCEPTION == *"${LIN_ERR}"* ]]; then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
fi



  


2. Re: Script para filtrar erro

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/07/2016 - 13:16h

rodrigofl20 escreveu:

Pessoal, preciso de um script que pesquise uma palavra em um arquivo, este arquivo é atualizado a cada segundo o script vai rodar a cada 1 min.
Sempre que na últimas 100 linhas ele encontrar a palavra "ORA-" ele deve me retornar a linha que ele achou, essa linha vai ser comparada já em um arquivo de exceções, ou seja, se a linha que contém a palavra "ORA-" existir no arquivo de exceção o script deve ignorar, mas deve me retornar a linha com o erro se a mesma não existir no arquivo de exceção.

Abaixo segue o que eu fiz até agora. A lógica creio que é mais ou menos essa, porém nesse caso ai ele está me retornando sempre o
echo "CONTÉM ERROS" 
porém eu adicionei o único erro que está aparecendo em $LIN_ERR, ao arquivo de exceção, não era pra me retornar o echo que diz "contém".

SID=orcl
DIR_ALERT=/home/lopes
LIN_ERR=$(tail -n100 $DIR_ALERT/alert_$SID.log | grep -i "ORA-")
EXCEPTION=$(cat /home/lopes/teste.txt)

if [[ $EXCEPTION == *"${LIN_ERR}"* ]]; then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
fi


Boa tarde Rodrigo.
Me "parece" que o erro é na VAR "$LIN_ERR",
Quando o script é iniciado, é atribuído um VALOR a "$LIN_ERR"
Esse VALOR sempre será o mesmo.
Exemplo:
HORA=$(date +"%H:%M:%S")
Sempre que "chamar" a VAR $HORA, o resultado será o do INICIO do SCRIPT, e não a Hora atual.

Alterando a VAR HORA, para o comando, temos:
HORA="date +"%H:%M:%S""

cnvdd@debian:~$ $HORA
13:28:16
cnvdd@debian:~$ $HORA
13:28:17

Sempre a hora atual . . .

Att.:
Marcelo Oliver






3. Re: Script para filtrar erro

Rodrigo
rodrigofl20

(usa Linux Mint)

Enviado em 19/07/2016 - 13:36h

msoliver escreveu:

rodrigofl20 escreveu:

Pessoal, preciso de um script que pesquise uma palavra em um arquivo, este arquivo é atualizado a cada segundo o script vai rodar a cada 1 min.
Sempre que na últimas 100 linhas ele encontrar a palavra "ORA-" ele deve me retornar a linha que ele achou, essa linha vai ser comparada já em um arquivo de exceções, ou seja, se a linha que contém a palavra "ORA-" existir no arquivo de exceção o script deve ignorar, mas deve me retornar a linha com o erro se a mesma não existir no arquivo de exceção.

Abaixo segue o que eu fiz até agora. A lógica creio que é mais ou menos essa, porém nesse caso ai ele está me retornando sempre o
echo "CONTÉM ERROS" 
porém eu adicionei o único erro que está aparecendo em $LIN_ERR, ao arquivo de exceção, não era pra me retornar o echo que diz "contém".

SID=orcl
DIR_ALERT=/home/lopes
LIN_ERR=$(tail -n100 $DIR_ALERT/alert_$SID.log | grep -i "ORA-")
EXCEPTION=$(cat /home/lopes/teste.txt)

if [[ $EXCEPTION == *"${LIN_ERR}"* ]]; then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
fi


Boa tarde Rodrigo.
Me "parece" que o erro é na VAR "$LIN_ERR",
Quando o script é iniciado, é atribuído um VALOR a "$LIN_ERR"
Esse VALOR sempre será o mesmo.
Exemplo:
HORA=$(date +"%H:%M:%S")
Sempre que "chamar" a VAR $HORA, o resultado será o do INICIO do SCRIPT, e não a Hora atual.

Alterando a VAR HORA, para o comando, temos:
HORA="date +"%H:%M:%S""

cnvdd@debian:~$ $HORA
13:28:16
cnvdd@debian:~$ $HORA
13:28:17

Sempre a hora atual . . .

Att.:
Marcelo Oliver





Mas eu realmente quero que o valor seja o mesmo até o fim da execução, só vai mudar quando for executado novamente.
A questão é que parece que o IF não está correto, mesmo que a string dentro da $LIN_ERR esteja na $EXCEPTION, ele imprime o ELSE, sendo que não era pra chegar ao ELSE.



4. IF?

Edmar
edmarssouzap

(usa Debian)

Enviado em 19/07/2016 - 14:03h

rodrigofl20 escreveu:

Pessoal, preciso de um script que pesquise uma palavra em um arquivo, este arquivo é atualizado a cada segundo o script vai rodar a cada 1 min.
Sempre que na últimas 100 linhas ele encontrar a palavra "ORA-" ele deve me retornar a linha que ele achou, essa linha vai ser comparada já em um arquivo de exceções, ou seja, se a linha que contém a palavra "ORA-" existir no arquivo de exceção o script deve ignorar, mas deve me retornar a linha com o erro se a mesma não existir no arquivo de exceção.

Abaixo segue o que eu fiz até agora. A lógica creio que é mais ou menos essa, porém nesse caso ai ele está me retornando sempre o
echo "CONTÉM ERROS" 
porém eu adicionei o único erro que está aparecendo em $LIN_ERR, ao arquivo de exceção, não era pra me retornar o echo que diz "contém".

SID=orcl
DIR_ALERT=/home/lopes
LIN_ERR=$(tail -n100 $DIR_ALERT/alert_$SID.log | grep -i "ORA-")
EXCEPTION=$(cat /home/lopes/teste.txt)

if [[ $EXCEPTION == *"${LIN_ERR}"* ]]; then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
fi



Boa tarde!!!

Cara, a estrutura do IF está correto, mas creio que a comparação da variável $EXCEPTION com a *${LIN_ERR}* pode estar incorreta. O * (asterisco) em volta da variável LIN_ERR já pode remeter a erros por ser um caractere coringa no shell, mas o que você está comparando é isto:


if [ $EXCEPTION = *ORA-* ]; then


Não sei o que tem dentro de $EXCEPTION, mas ele teria que ser igual a *ORA-* para casar no IF. Você viu onde está seu erro? Então é isso.

Até.



5. Re: Script para filtrar erro

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/07/2016 - 14:52h

rodrigofl20 escreveu:
Mas eu realmente quero que o valor seja o mesmo até o fim da execução, só vai mudar quando for executado novamente.
A questão é que parece que o IF não está correto, mesmo que a string dentro da $LIN_ERR esteja na $EXCEPTION, ele imprime o ELSE, sendo que não era pra chegar ao ELSE.

Boa tarde Rodrigo.
Segue uma sugestão:

if egrep 'ORA-' <<< $(tail -n100 /home/lopes/alert_orcl.log) > LINHA_ERRO.txt;then
if egrep -f LINHA_ERRO.txt /home/lopes/teste.txt;then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
cat LINHA_ERRO.txt
fi
fi

Busca por "ORA-" nas ultimas 100 linhas do ARQUIVO "/home/lopes/alert_orcl.log", gera LINHA_ERRO.txt
Se encontrar, busca pelo conteúdo de LINHA_ERRO.txt no arquivo /home/lopes/teste.txt (EXCEPTION)
Encontrando em EXCEPTION
echo "SEM ERROS"
Senão
echo "CONTÉM ERROS"
Mostra o ERRO:
cat LINHA_ERRO.txt

É isso...
E não esqueça, se a resposta foi útil, marque-a como A MELHOR. . . :)

Att.:
Marcelo Oliver


6. Re: Script para filtrar erro

Rodrigo
rodrigofl20

(usa Linux Mint)

Enviado em 19/07/2016 - 15:25h

edmarssouzap escreveu:

rodrigofl20 escreveu:

Pessoal, preciso de um script que pesquise uma palavra em um arquivo, este arquivo é atualizado a cada segundo o script vai rodar a cada 1 min.
Sempre que na últimas 100 linhas ele encontrar a palavra "ORA-" ele deve me retornar a linha que ele achou, essa linha vai ser comparada já em um arquivo de exceções, ou seja, se a linha que contém a palavra "ORA-" existir no arquivo de exceção o script deve ignorar, mas deve me retornar a linha com o erro se a mesma não existir no arquivo de exceção.

Abaixo segue o que eu fiz até agora. A lógica creio que é mais ou menos essa, porém nesse caso ai ele está me retornando sempre o
echo "CONTÉM ERROS" 
porém eu adicionei o único erro que está aparecendo em $LIN_ERR, ao arquivo de exceção, não era pra me retornar o echo que diz "contém".

SID=orcl
DIR_ALERT=/home/lopes
LIN_ERR=$(tail -n100 $DIR_ALERT/alert_$SID.log | grep -i "ORA-")
EXCEPTION=$(cat /home/lopes/teste.txt)

if [[ $EXCEPTION == *"${LIN_ERR}"* ]]; then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
fi



Boa tarde!!!

Cara, a estrutura do IF está correto, mas creio que a comparação da variável $EXCEPTION com a *${LIN_ERR}* pode estar incorreta. O * (asterisco) em volta da variável LIN_ERR já pode remeter a erros por ser um caractere coringa no shell, mas o que você está comparando é isto:


if [ $EXCEPTION = *ORA-* ]; then


Não sei o que tem dentro de $EXCEPTION, mas ele teria que ser igual a *ORA-* para casar no IF. Você viu onde está seu erro? Então é isso.

Até.


Na verdade o que tem dentro de LIN_ERR é uma série de linhas que contém a string "ORA-" em qualquer posição da linha. Na variável EXCEPTION terá todos os "ORA-" que podem ser ignorados, exemplo: LIN_ERR = "ORA-001". Se a EXCEPTION também tiver "ORA-001" é pra ignorar.



7. Re: Script para filtrar erro

Rodrigo
rodrigofl20

(usa Linux Mint)

Enviado em 19/07/2016 - 15:37h

msoliver escreveu:

rodrigofl20 escreveu:
Mas eu realmente quero que o valor seja o mesmo até o fim da execução, só vai mudar quando for executado novamente.
A questão é que parece que o IF não está correto, mesmo que a string dentro da $LIN_ERR esteja na $EXCEPTION, ele imprime o ELSE, sendo que não era pra chegar ao ELSE.

Boa tarde Rodrigo.
Segue uma sugestão:

if egrep 'ORA-' <<< $(tail -n100 /home/lopes/alert_orcl.log) > LINHA_ERRO.txt;then
if egrep -f LINHA_ERRO.txt /home/lopes/teste.txt
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
cat LINHA_ERRO.txt
fi
fi

Busca por "ORA-" nas ultimas 100 linhas do ARQUIVO "/home/lopes/alert_orcl.log", gera LINHA_ERRO.txt
Se encontrar, busca pelo conteúdo de LINHA_ERRO.txt no arquivo /home/lopes/teste.txt (EXCEPTION)
Encontrando em EXCEPTION
echo "SEM ERROS"
Senão
echo "CONTÉM ERROS"
Mostra o ERRO:
cat LINHA_ERRO.txt

É isso...
E não esqueça, se a resposta foi útil, marque-a como A MELHOR. . . :)

Att.:
Marcelo Oliver


Testei exatamente como sugeriu, o primeiro IF jogou pro .txt todas as 100 linhas, não filtrou. Dai o segundo também saiu errado. O "egrep" não funcionou da mesma forma que o "grep -i". Vou tentar alterar isso.


8. Re: Script para filtrar erro

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/07/2016 - 16:28h

rodrigofl20 escreveu:
Testei exatamente como sugeriu, o primeiro IF jogou pro .txt todas as 100 linhas, não filtrou. Dai o segundo também saiu errado. O "egrep" não funcionou da mesma forma que o "grep -i". Vou tentar alterar isso.


Muito estranho!!!
Testei aqui e funcionou como previsto....
Em LINHA_ERRO.txt, tem a saída do 1º egrep, que, se bem sucedido,
executa o 2º egrep, que usa LINHA_ERRO.txt como " STRING de BUSCA", para buscar em /home/lopes/teste.txt . . .

Marcelo Oliver



9. Re: Script para filtrar erro

Rodrigo
rodrigofl20

(usa Linux Mint)

Enviado em 19/07/2016 - 16:43h

msoliver escreveu:

rodrigofl20 escreveu:
Testei exatamente como sugeriu, o primeiro IF jogou pro .txt todas as 100 linhas, não filtrou. Dai o segundo também saiu errado. O "egrep" não funcionou da mesma forma que o "grep -i". Vou tentar alterar isso.


Muito estranho!!!
Testei aqui e funcionou como previsto....
Em LINHA_ERRO.txt, tem a saída do 1º egrep, que, se bem sucedido,
executa o 2º egrep, que usa LINHA_ERRO.txt como " STRING de BUSCA", para buscar em /home/lopes/teste.txt . . .

Marcelo Oliver


No seu teste retornou apenas a linha encontrada? Aqui veio as 100.



10. Re: Script para filtrar erro

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/07/2016 - 17:40h

rodrigofl20 escreveu:
No seu teste retornou apenas a linha encontrada? Aqui veio as 100.


Sim Rodrigo, apenas a linha encontrada.
Desculpa ae Rodrigo!!!!
Testei no terminal de um modo e postei de outro....
Poucas alterações, no 1º egrep tem o "-o", que é justamente "SOMENTE O QUE CASOU"


if egrep -o 'ORA-' <<< $(tail -n100 /home/lopes/alert_orcl.log) > LINHA_ERRO.txt;then
if egrep -q -f LINHA_ERRO.txt /home/lopes/teste.txt;then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
cat LINHA_ERRO.txt
fi
fi


Att.:
Marcelo Oliver


11. Re: Script para filtrar erro

Rodrigo
rodrigofl20

(usa Linux Mint)

Enviado em 19/07/2016 - 17:48h

msoliver escreveu:

rodrigofl20 escreveu:
No seu teste retornou apenas a linha encontrada? Aqui veio as 100.


Sim Rodrigo, apenas a linha encontrada.
Desculpa ae Rodrigo!!!!
Testei no terminal de um modo e postei de outro....
Poucas alterações, no 1º egrep tem o "-o", que é justamente "SOMENTE O QUE CASOU"


if egrep -o 'ORA-' <<< $(tail -n100 /home/lopes/alert_orcl.log) > LINHA_ERRO.txt;then
if egrep -q -f LINHA_ERRO.txt /home/lopes/teste.txt;then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
cat LINHA_ERRO.txt
fi
fi


Att.:
Marcelo Oliver


Marcelo, testei aqui e o resultado dessa fez mudou mas continua fora do esperado. Dessa vez ele retornou apenas a palavra "ORA-" que ele encontrou, exemplo, ele encontrou 7 ORA-, retornou ele 7 vezes, mas não as linhas, veio só a string mesmo.
Dei uma olhada no help do egrep e vi isso "-o, --only-matching mostra apenas a parte da linha que coincide com o PADRÃO".
Não achei outra opção que talvez possa servir para o propósito, acho que o egrep não é a ferramenta certa... =/
Vlw pela ajuda até agora.
Vou testar outras tools.



12. Re: Script para filtrar erro

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/07/2016 - 19:36h

rodrigofl20 escreveu:

msoliver escreveu:

rodrigofl20 escreveu:
No seu teste retornou apenas a linha encontrada? Aqui veio as 100.


Sim Rodrigo, apenas a linha encontrada.
Desculpa ae Rodrigo!!!!
Testei no terminal de um modo e postei de outro....
Poucas alterações, no 1º egrep tem o "-o", que é justamente "SOMENTE O QUE CASOU"


if egrep -o 'ORA-' <<< $(tail -n100 /home/lopes/alert_orcl.log) > LINHA_ERRO.txt;then
if egrep -q -f LINHA_ERRO.txt /home/lopes/teste.txt;then
echo "SEM ERROS"
else
echo "CONTÉM ERROS"
cat LINHA_ERRO.txt
fi
fi


Att.:
Marcelo Oliver


Marcelo, testei aqui e o resultado dessa fez mudou mas continua fora do esperado. Dessa vez ele retornou apenas a palavra "ORA-" que ele encontrou, exemplo, ele encontrou 7 ORA-, retornou ele 7 vezes, mas não as linhas, veio só a string mesmo.
Dei uma olhada no help do egrep e vi isso "-o, --only-matching mostra apenas a parte da linha que coincide com o PADRÃO".
Não achei outra opção que talvez possa servir para o propósito, acho que o egrep não é a ferramenta certa... =/
Vlw pela ajuda até agora.
Vou testar outras tools.


Rodrigo,
O conteúdo de /home/lopes/teste.txt, e mais ou menos esse abaixo?
ORA-001
ORA-004
ORA-010
. . .
Poste um trecho do ARQUIVO /home/lopes/alert_orcl.log
OBS.: para o EGREP retornar o Nº da LINHA, no 1º EGREP, faça:
if egrep -on 'ORA' <<< $(tail -n100 /home/lopes/alert_orcl.log) > LINHA_ERRO.txt;then
A saída será, exemplo:
560:ORA
Ou vc trata com o SED, ou altera em EXCEPTION
SAÍDA TRATADA COM O SED:
if egrep -on 'ORA' <<< $(tail -n100 /home/lopes/alert_orcl.log)|sed -r 's/^([0-9]+):(ORA)/\2-\1/' > LINHA_ERRO.txt;then
SAíDA:
ORA-560
marcelo




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts