Leitura de texto e jogar em um .log

1. Leitura de texto e jogar em um .log

Victor Cezar
vitinhoops

(usa Red Hat)

Enviado em 08/10/2014 - 14:52h

Ola pessoal, sou novo no fórum e gostaria de uma ajuda. Estou tentando fazer um script que leia o DUMP de algumas bases que pegue o nome, horário inicial e horário final (mais para frente ver se tem algum erro, mas por hora o que eu falei já me ajuda muito). vou mostrar a pasta mais ou menos como é.

Tenho a seguinte estrutura

>PASTADUMPS
>>BASE1
>>BASE2
>>BASE3
>>BASE4
>>BASE5

cada pasta tem os seguintes arquivos (ex)

>>BASE1
>>>base1.dmp
>>>base1.log

eu preciso ler o arquivo base1.log, preciso do head (que mostra o horario inicial) e o tail ( que mostra o horario final).

segue um exemplo

head base1.log

Export: Release 11.2.0.2.0 - Production on Ter Out 7 19:10:01 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
;;;
Conectado a: Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
x
x
x
x
x
x


tail base1.log
x
x
x
x
******************************************************************************
Conjunto de arquivos de dump para X.Y �:
/pastadumps/base1/base1.dmp
O job "SYSTEM"."SYS_EXPORT_FULL_02" foi conclu�do com sucesso em 20:44:24


Como podem ver eu tenho o horario incial e final. na PASTADUMPS eu dava um head */*.log | more e conseguia ver o head de todas as pastas tentava executar com um sed e cut e já nao dava mais certo, estou totalmente perdido, não tenho noção de fazer shells, eu iria agradecer por uma luz. meu objetivo é que ele execute o script, jogue em um arquivo .log e fique mais ou menos assim

BASES -- H.INICIAL / H. FINAL
base1 10:00/11:00
base2 12:00/14:00
base3 09:00/22:00

Alguém por favor pode me ajudar?


Att.


  


2. Re: Leitura de texto e jogar em um .log

Ton Melo
IZhaq_melo

(usa FreeBSD)

Enviado em 08/10/2014 - 15:38h

vitinhoops escreveu:

Ola pessoal, sou novo no fórum e gostaria de uma ajuda. Estou tentando fazer um script que leia o DUMP de algumas bases que pegue o nome, horário inicial e horário final (mais para frente ver se tem algum erro, mas por hora o que eu falei já me ajuda muito). vou mostrar a pasta mais ou menos como é.

Tenho a seguinte estrutura

>PASTADUMPS
>>BASE1
>>BASE2
>>BASE3
>>BASE4
>>BASE5

cada pasta tem os seguintes arquivos (ex)

>>BASE1
>>>base1.dmp
>>>base1.log

eu preciso ler o arquivo base1.log, preciso do head (que mostra o horario inicial) e o tail ( que mostra o horario final).

segue um exemplo

head base1.log

Export: Release 11.2.0.2.0 - Production on Ter Out 7 19:10:01 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
;;;
Conectado a: Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
x
x
x
x
x
x


tail base1.log
x
x
x
x
******************************************************************************
Conjunto de arquivos de dump para X.Y �:
/pastadumps/base1/base1.dmp
O job "SYSTEM"."SYS_EXPORT_FULL_02" foi conclu�do com sucesso em 20:44:24


Como podem ver eu tenho o horario incial e final. na PASTADUMPS eu dava um head */*.log | more e conseguia ver o head de todas as pastas tentava executar com um sed e cut e já nao dava mais certo, estou totalmente perdido, não tenho noção de fazer shells, eu iria agradecer por uma luz. meu objetivo é que ele execute o script, jogue em um arquivo .log e fique mais ou menos assim

BASES -- H.INICIAL / H. FINAL
base1 10:00/11:00
base2 12:00/14:00
base3 09:00/22:00

Alguém por favor pode me ajudar?


Att.


Calma vamos resolver um problema:

por partes.
1º) leia o DUMP de algumas bases que pegue o nome, horário inicial e horário final
São varias bases o ideal não seria um script por base?

2º) teria como voce clarear o segunda parte:

se possivel um pouco mais descritivo:

'Como podem ver eu tenho o horario incial e final. na PASTADUMPS eu dava um head */*.log | more e conseguia ver o head de todas as pastas tentava executar com um sed e cut
>>BASE1'
>>>base1.dmp
>>>base1.log

acho que via cut pode dar problema senao tiver um padrao de colunas.


3. Re: Leitura de texto e jogar em um .log

Victor Cezar
vitinhoops

(usa Red Hat)

Enviado em 08/10/2014 - 15:52h

IZhaq_melo escreveu:


Calma vamos resolver um problema:

por partes.
1º) leia o DUMP de algumas bases que pegue o nome, horário inicial e horário final
São varias bases o ideal não seria um script por base?

2º) teria como voce clarear o segunda parte:

se possivel um pouco mais descritivo:

'Como podem ver eu tenho o horario incial e final. na PASTADUMPS eu dava um head */*.log | more e conseguia ver o head de todas as pastas tentava executar com um sed e cut
>>BASE1'
>>>base1.dmp
>>>base1.log

acho que via cut pode dar problema senao tiver um padrao de colunas.




1º) todas as bases ficam em maquinas diferentes e todos os DUMPS e logs são centralizados no storage que fica 'nessa' estrutura, montar um script de maquina em maquina daria muito trabalho, pois há mais de 50 bases, acho que o ideal seria ser na pasta que são alocada os dumps.

2º)Essa segunda parte eu dava o comando head */*.log e ele listava o head das 50 bases, essa parte que eu tentei usar o cut e send, ignora, porque nao deu certo.. fazia algo do tipo head */*.log | send '3 p' */*.log | cut -c 66-73 .... mas enfim, acho que não por ai o caminho.

Obg pela resposta




4. Re: Leitura de texto e jogar em um .log

Fernando
phoemur

(usa Debian)

Enviado em 08/10/2014 - 23:12h

POH (Programação Orientada a Hieróglifos)..rs é tudo na mesma linha
executar no diretório base (PASTADUMPS)


find . -type f -iname "*.log" | while read FILE; do echo "$(basename $FILE .log)"; sed -n '/[0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}/s/^.*\([0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\).*$/\1/p' "$FILE" | sed -n '1p;$p'; done | xargs -n3


talvez a forma menos eficiente de fazer...rs
Era algo assim?


5. Re: Leitura de texto e jogar em um .log

Victor Cezar
vitinhoops

(usa Red Hat)

Enviado em 09/10/2014 - 09:02h

phoemur escreveu:

POH (Programação Orientada a Hieróglifos)..rs é tudo na mesma linha
executar no diretório base (PASTADUMPS)


find . -type f -iname "*.log" | while read FILE; do echo "$(basename $FILE .log)"; sed -n '/[0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}/s/^.*\([0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\).*$/\1/p' "$FILE" | sed -n '1p;$p'; done | xargs -n3


talvez a forma menos eficiente de fazer...rs
Era algo assim?


Obrigado pela resposta.

testei o comando e ficou assim

base1 9:30:01 9:30:01
base2 0:00:01 0:00:01
base3 8:00:01 8:00:01

Quase deu certo, o problema é que ele come o primeiro digito e só está pegando o horário inicial.
A saída do comando deveria sair assim

base1 19:30:01 22:20:01 (por exemplo)

e não assim

base1 9:30:01 9:30:01

Obrigado pela paciência de me ajudar no comando...
agora, como posso resolver isso?


6. Re: Leitura de texto e jogar em um .log

Fernando
phoemur

(usa Debian)

Enviado em 09/10/2014 - 18:34h


find . -type f -iname "*.log" | while read FILE; do echo "$(basename $FILE .log)"; sed -n '/[0-9]\{2\}:[0-9]\{1,2\}:[0-9]\{1,2\}/s/^.*\([0-9]\{2\}:[0-9]\{1,2\}:[0-9]\{1,2\}\).*$/\1/gp' "$FILE" | sed -n '1p;$p'; done | xargs -n3


experimenta assim, agora no arquivo que você passou como exemplo parece que está funcionando certo aqui com o novo comando

base1 19:10:01 20:44:24


você copiou e colou o comando ? qual a versão do seu sed?
aqui é
sed (GNU sed) 4.2.2


7. Re: Leitura de texto e jogar em um .log

Fernando
phoemur

(usa Debian)

Enviado em 09/10/2014 - 18:57h

Agora veja que você consegue fazer a mesma coisa com um script python de forma bem mais elegante:


#!/usr/bin/env python

import glob
import re
import os

pattern = re.compile('\d\d:\d\d:\d\d')
for filename in glob.glob('*/*.log'):
with open(filename, mode='r') as fd:
result = pattern.findall(fd.read())

if len(result) <= 1:
print('{0} -> error parsing'.format(os.path.basename(filename)[:-4]))
continue

print('{0} {1} {2}'.format(os.path.basename(filename)[:-4],
result[0],
result[-1]))


Na minha opinião todo sysadmin deveria saber uma linguagem de scripts além do shellscript, como por exemplo python, perl, ruby entre outras pois isso facilita muito.

Muito melhor que o comandaço gambiarra e demorou até menos pra fazer.
Execute na pasta PASTADUMPS


8. Re: Leitura de texto e jogar em um .log

Victor Cezar
vitinhoops

(usa Red Hat)

Enviado em 10/10/2014 - 09:47h

phoemur escreveu:

Agora veja que você consegue fazer a mesma coisa com um script python de forma bem mais elegante:


#!/usr/bin/env python

import glob
import re
import os

pattern = re.compile('\d\d:\d\d:\d\d')
for filename in glob.glob('*/*.log'):
with open(filename, mode='r') as fd:
result = pattern.findall(fd.read())

if len(result) <= 1:
print('{0} -> error parsing'.format(os.path.basename(filename)[:-4]))
continue

print('{0} {1} {2}'.format(os.path.basename(filename)[:-4],
result[0],
result[-1]))


Na minha opinião todo sysadmin deveria saber uma linguagem de scripts além do shellscript, como por exemplo python, perl, ruby entre outras pois isso facilita muito.

Muito melhor que o comandaço gambiarra e demorou até menos pra fazer.
Execute na pasta PASTADUMPS



Novamente, muito agradecido.
Eu também acho que deveria conhecer mais essas linguagens, na verdade nem sou de linux, sou DBA, e uns conhecimentos desses é realmente um diferencial.

Joguei isso esse script e realmente deu certo!, muito obrigado, já vou começar a utilizar...

Não querendo abusar mais já abusando, queria perguntar se é possivel mais 3 coisas,se for incomodar não se preocupe é só um diferencial, vou ordenar por prioridade

1-) se é possível aparecer a data também, por exemplo na linha que tem o horário tem também o dia e o mês.

Export: Release 11.2.0.3.0 - Production on Qui Set 18 18:00:01 2014

seria possível deixar a saída assim?
SET 18 BASE1 18:00:01 19:00:00

2-) As vezes os export dão erro e a linha aonde tem o horario de termino fica assim

O job "SYSTEM"."SYS_EXPORT_FULL_02" foi concluido com 1 erro(s) em 20:52:23


Seria possível, deixar no final do script o nome das bases que deram erro? Exemplo
.
..
...
SET 18 BASE29 15:00:01 18:00:00
SET 18 BASE30 02:00:01 05:00:00
--------- COM erro -----------
base10
base23
base11

3-) Na hora de por o horário colocar uma barra, exemplo

SET 18 BASE23 15:00:01/18:00:00

Obrigado pela atenção e pela ajuda, e me desculpe o incomodo.

Att.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts