Dúvida sobre o retorno de uma string com base no comando (aplicação)

1. Dúvida sobre o retorno de uma string com base no comando (aplicação)

Mauricio Rodrigues da SIlva
mauriciosist

(usa Linux Mint)

Enviado em 14/02/2019 - 12:33h

Olá para vc que vai me ajudar, desde já de agradeço do fundo do meu coração!

A dúvida é a seguinte, preciso criar um arquivo .sh que grave em um arquivo txt a informação encontrada de forma tratada.
Exemplo.: Existe uma aplicação que roda todas as noites (.sh que está no cron), preciso criar uma aplicativo para analisar o LOG gerado dessa aplicação buscando uma relação de palavras-chave (ronection refused, erro, conection time out e etc) e gravando em um outro arquivo essas palavras chaves com a linha do erro, isso deveria ser no tempo de execução.

Comecei da seguinte forma se poder me ajudar agradeço.

#!/bin/bash
#arquivo de log que está sendo gerado
arquivo="/home/teste/Documentos/robo/log.txt"

#lista de palavras que preciso encontrar no log
lista="/home/teste/Documentos/robo/lista.txt"
var="true"

while [ $var = "true" ]; do
if [ `tail -f -n 1 $arquivo | grep -Ein $lista $` ]
then
#encontrando uma resposta da lista acima
#extrair da linha encontrada apenas o próprio texto que está na lista concatenando com "e". Ex.: conection refused e conection time out e etc...
encontrando >> log_tratado.txt
fi
done

será que fica difícil!


  


2. Re: Dúvida sobre o retorno de uma string com base no comando (aplicação)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 14/02/2019 - 15:57h

Boa tarde.
Se postar um trecho do arquivo de LOG e do arquivo de palavras é mais fácil ajudar...
Uma opção, é incluir "essa busca de palavras", no seu script atual....Poste o script.
No aguardo.
Marcelo Oliver


3. Resposta

Mauricio Rodrigues da SIlva
mauriciosist

(usa Linux Mint)

Enviado em 14/02/2019 - 16:09h

Opa!
Está na mão meu amigo...

Uma parte de um log: (log_carga_dimensoes_gerais.txt)

2019/02/14 04:27:08 - Starting entry [dim_linha_totalbus NEWXX]
2019/02/14 04:27:08 - dim_linha_totalbus NEWXX - Loading transformation from repository [dim_linha_totalbus NEWXX] in directory [/root/vendas/TOTALBUS/Dimensions]
2019/02/14 04:27:11 - dim_linha_totalbus NEWXX - Expedindo in�cio para transforma��o [dim_linha_totalbus NEWXX]
2019/02/14 04:27:11 - Table output.0 - Connected to database [DW_JCA] (commit=1000)
2019/02/14 04:27:12 - ruta.0 - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : Erro inesperado
2019/02/14 04:27:12 - ruta.0 - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseException:
2019/02/14 04:27:12 - ruta.0 - An error occurred executing SQL:
2019/02/14 04:27:12 - ruta.0 - select r.ruta_id,r.numruta,
2019/02/14 04:27:12 - ruta.0 - cast(cast(substr(r.numruta,2) as integer) as varchar2(5)) as cod_linha_srvp,
2019/02/14 04:27:12 - ruta.0 - cast(substr(r.numruta,2) as integer) as cod_linha_srvp_int,
2019/02/14 04:27:12 - ruta.0 - re.empresa_id,
2019/02/14 04:27:12 - ruta.0 - trunc(r.FECMODIF) as data_modificacao,
2019/02/14 04:27:12 - ruta.0 - oc.descorgao as org_conc,
2019/02/14 04:27:12 - ruta.0 - r.descruta as nome,
2019/02/14 04:27:12 - ruta.0 - cs.cveclase as cod_classe,
2019/02/14 04:27:12 - ruta.0 - cs.descclase as classe
2019/02/14 04:27:12 - ruta.0 - from vtabol.ruta r
2019/02/14 04:27:12 - ruta.0 - left join vtabol.orgao_concedente oc on oc.orgaoconcedente_id = r.orgaoconcedente_id and oc.activo = 1
2019/02/14 04:27:12 - ruta.0 - left join vtabol.clase_servicio cs on r.claseservicio_id = cs.claseservicio_id and cs.activo = 1
2019/02/14 04:27:12 - ruta.0 - join vtabol.ruta_empresa re on re.ruta_id = r.ruta_id and re.activo = 1
2019/02/14 04:27:12 - ruta.0 - -- and re.empresa_id = 5
2019/02/14 04:27:12 - ruta.0 - and r.numruta is not null and r.numruta <> ' ' -- erros de cadastro
2019/02/14 04:27:12 - ruta.0 - -- and length(r.numruta)<=4
2019/02/14 04:27:12 - ruta.0 - -- where r.numruta in ('5267','5270')
2019/02/14 04:27:12 - ruta.0 - -- and r.numruta = '6058'
2019/02/14 04:27:12 - ruta.0 - order by r.ruta_id
2019/02/14 04:27:12 - ruta.0 - ORA-01722: número inválido
2019/02/14 04:27:12 - ruta.0 -
2019/02/14 04:27:12 - ruta.0 -
2019/02/14 04:27:12 - ruta.0 - at org.pentaho.di.core.database.Database.openQuery(Database.java:1687)
2019/02/14 04:27:12 - ruta.0 - at org.pentaho.di.trans.steps.tableinput.TableInput.doQuery(TableInput.java:224)
2019/02/14 04:27:12 - ruta.0 - at org.pentaho.di.trans.steps.tableinput.TableInput.processRow(TableInput.java:138)
2019/02/14 04:27:12 - ruta.0 - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2019/02/14 04:27:12 - ruta.0 - at java.lang.Thread.run(Unknown Source)
2019/02/14 04:27:12 - ruta.0 - Caused by: java.sql.SQLException: ORA-01722: número inválido
2019/02/14 04:27:12 - ruta.0 -
2019/02/14 04:27:12 - ruta.0 - at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
2019/02/14 04:27:12 - ruta.0 - at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
2019/02/14 04:27:12 - ruta.0 - at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
2019/02/14 04:27:12 - ruta.0 - at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
2019/02/14 04:27:12 - ruta.0 - at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
2019/02/14 04:27:12 - ruta.0 - at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:946)
2019/02/14 04:27:12 - ruta.0 - at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1060)

Aqui localizando vários logs que contenham erro...

/var/pentaho/logs_carga_diaria/log_carga_diaria_cometa_main.txt:7:2019/02/14 08:00:09 - SQL - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : An error occurred executing this job entry :
/var/pentaho/logs_carga_diaria/log_carga_diaria_cometa_main.txt:65:2019/02/14 08:00:09 - Kitchen - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : Finished with errors
/var/pentaho/logs_carga_diaria/log_carga_diaria_cometa_main.txt:74:2019/02/14 08:00:18 - SQL - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : An error occurred executing this job entry :
/var/pentaho/logs_carga_diaria/log_carga_diaria_cometa_main.txt:132:2019/02/14 08:00:18 - Kitchen - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : Finished with errors
/var/pentaho/logs_carga_diaria/monitora_dims_scd.log:9:2019/02/14 06:00:15 - KAIOWA.0 - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : An error occurred, processing will be stopped:
/var/pentaho/logs_carga_diaria/monitora_dims_scd.log:38:2019/02/14 06:00:15 - Kitchen - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : Finished with errors
/var/pentaho/logs_carga_diaria/log_job_guia_servicos_cometa.txt:115:2019/02/14 06:14:45 - org.pentaho.di.trans.steps.databasejoin.DatabaseJoinMeta@b355bbe - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : Ocorreu um erro de banco de dados:
/var/pentaho/logs_carga_diaria/log_diario_avc_20190214_062022:36:2019/02/14 06:20:38 - SQL VTACATAR - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : An error occurred executing this job entry :
/var/pentaho/logs_carga_diaria/log_vendas_1001.txt:278:2019/02/14 09:58:19 - SQL - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : An error occurred executing this job entry :
/var/pentaho/logs_carga_diaria/log_vendas_1001.txt:1085:2019/02/14 10:32:24 - SQL - ERROR (version 5.3.0.0-213, build 1 from 2015-02-02_12-17-08 by buildguy) : An error occurred executing this job entry :
/var/pentaho/logs_carga_diaria/log_carga_SF_encomendas.txt:565:2019/02/14 11:35:03 - PRODUCAO_DB01_CE_POSTGRES - There was an error getting information from the version table R_VERSION.
/var/pentaho/logs_carga_diaria/log_carga_SF_encomendas.txt:568:2019/02/14 11:35:03 - PRODUCAO_DB01_CE_POSTGRES - An error occurred executing SQL:
/var/pentaho/logs_carga_diaria/log_carga_dimensoes_gerais.txt:1534:2019/02/14 04:27:12 - ruta.0 - An error occurred executing SQL:
/var/pentaho/logs_carga_diaria/log_carga_dimensoes_gerais.txt:1549:2019/02/14 04:27:12 - ruta.0 - and r.numruta is not null and r.numruta <> ' ' -- erros de cadastro
/var/pentaho/logs_carga_diaria/log_carga_dimensoes_gerais.txt:1598:2019/02/14 04:27:12 - Memory Group by.0 - and r.numruta is not null and r.numruta <> ' ' -- erros de cadastro
/var/pentaho/logs_carga_diaria/log_carga_dimensoes_gerais.txt:1618:2019/02/14 04:27:12 - Memory Group by.0 - and r.numruta is not null and r.numruta <> ' ' -- erros de cadastro
/var/pentaho/logs_carga_diaria/log_carga_dimensoes_gerais.txt:1668:2019/02/14 04:27:12 - Memory Group by.0 - and r.numruta is not null and r.numruta <> ' ' -- erros de cadastro

O arquivo com a lista de erro é bem simples: (lista.txt)

erros de cadastro
erro de banco de dados
SQL - ERROR
error occurred


4. Re: Dúvida sobre o retorno de uma string com base no comando (aplicação)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 14/02/2019 - 19:15h


Boa noite Mauricio.
Veja se estou no caminho certo....
while IFS=$'\n' read ERRO;do
echo -e "\n\"$ERRO\"";
grep "${ERRO}" log.txt >> ARQUIVO_ERROS_LOG.txt;
done<erros.txt


Marcelo Oliver


5. Ficando Show

Mauricio Rodrigues da SIlva
mauriciosist

(usa Linux Mint)

Enviado em 15/02/2019 - 11:01h

Meu amigo, desde já quero agradecer pela ajuda, porém, vamos as obs...

1. Com uma pequena modificada no código está gravando exatamente o que encontra.
2. No meu exemplo eu mencionei o TAIL pois seria para o nosso sh ficar em execução enquanto o outro vai guardando log... Isso seria muito importante, ser executado enquanto outro sh roda, para pegar o erro em tempo real.
3. Teria como guardar os textos encontrados concatenando na frente ao inves de quebrar linha?
4. Seria pedir muito se comentasse explicando os comandos, tipo esse IFS...
As mudanças:

while IFS=$'\n' read ERRO;do
#abaixo guardo o encontrado no arquivo de log2.txt
echo -e $ERRO >> log2.txt
#comentei abaixo pois estava exivindo varias informações desnecessárias.
#grep "${ERRO} log.txt >> log2.txt
done<lista.txt

Mais uma coisa:
log.txt: É o log que queremos analisar se existe erros.
log2.txt: É o segundo log guardando os erros (concatenados).
lista.txt: É a relação dos erros que queremos encontrar...

Aguardo sua ajuda...
OBS.: Como formato meu texto assim como o seu aqui no forum?


6. Re: Dúvida sobre o retorno de uma string com base no comando (aplicação)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 15/02/2019 - 17:10h


mauriciosist escreveu:

Meu amigo, desde já quero agradecer pela ajuda, porém, vamos as obs...

1. Com uma pequena modificada no código está gravando exatamente o que encontra.
2. No meu exemplo eu mencionei o TAIL pois seria para o nosso sh ficar em execução enquanto o outro vai guardando log... Isso seria muito importante, ser executado enquanto outro sh roda, para pegar o erro em tempo real.
3. Teria como guardar os textos encontrados concatenando na frente ao inves de quebrar linha?
4. Seria pedir muito se comentasse explicando os comandos, tipo esse IFS...
As mudanças:

while IFS=$'\n' read ERRO;do
#abaixo guardo o encontrado no arquivo de log2.txt
echo -e $ERRO >> log2.txt

#comentei abaixo pois estava exivindo varias informações desnecessárias.
#grep "${ERRO} log.txt >> log2.txt
done<lista.txt

Mais uma coisa:
log.txt: É o log que queremos analisar se existe erros.
log2.txt: É o segundo log guardando os erros (concatenados).
lista.txt: É a relação dos erros que queremos encontrar...

Aguardo sua ajuda...
OBS.: Como formato meu texto assim como o seu aqui no forum?


Boa tarde Mauricio.
Vamos as respostas...
1. Com uma pequena modificada no código está gravando exatamente o que encontra.
Está gravando somente o que tem na lista.txt, e não os erros encontrados no log...
2. No meu exemplo eu mencionei o TAIL ...
Eliminei o "tail", pois não acho eficiente "analisar" somente a ultima linha....
O "tail" seria viável SE, após uma linha ser acrescentada no log, buscar pelo "ERRO"...
3. Teria como guardar os textos encontrados...
SIM, use:
echo -n "Com o \"-n\", não quebra a linha"
Outra opção é o "printf"
4. Seria pedir muito se comentasse ....
while IFS=$'\n' read ERRO;do #Enquanto o IFS (Separador de Campo de Entrada) é = "\n"(quebra de linha), define a var ERRO com o conteúdo da linha.
#abaixo guardo o encontrado no arquivo de log2.txt
echo -n "${ERRO} e " >> log2.txt
#comentei abaixo pois estava exibindo varias informações desnecessárias.
#grep "${ERRO} log.txt >> log2.txt #Esta linha é a que "busca" o ERRO no LOG...
done<lista.txt


O comando abaixo, é para ler linha por linha do arquivo especificado:
while IFS=$'\n' read ERRO;do 
echo -n "${ERRO} e "
done<lista.txt #lista.txt é o arquivo especificado


OBS.: Como formato meu texto assim como o seu aqui no forum?
Pressione Alt+c e coloque o texto entre os "CODE"

att.:
Marcelo Oliver







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts