shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Expressão Regular para formatar log [Resolvido]


From: andelnyr
Subject: Re: Expressão Regular para formatar log [Resolvido]
Date: Mon, 11 Oct 2010 22:08:32 -0000
User-agent: eGroups-EW/0.82

Prezados

Utilizando as sugestões do Jimmy e do Cristiano, pude melhorar bastante o 
script para a formatação de logs que ficou assim:

#!/bin/bash
sed 's/^h//g
2a\HORA
1,2d' $1 | csplit -s - '/:00/' {*}
paste -s $(ls xx* | sed 's/xx/00' | sort -n | sed 's/^00/xx/g') > $1.csv
rm xx*

Funcionou como um foguete - é o tempo de apertar o Enter e pronto! E pensar que 
o meu script antigo demorava quase um minuto para fazer a mesma coisa em 
arquivos grandes...

Ocorre que como os arquivos gerados pelo csplit são xx00, xx01, xx02... na hora 
do paste montar o arquivo final, as partes são coladas seguindo uma forma 
doida: xx09, xx10, xx100, xx101... o que acaba produzindo um log embaralhado. 
Precisei fazer um jeito de ordenar os nomes dos arquivos, uma vez que não 
consegui o mesmo efeito com as opções do sort ou do paste.

Mais uma vez agradeço as orientações recebidas.

Angelo Sampaio

> > 
> > Eu simplifiquei o seu exemplo para isto:
> > 
> > $ cat teste.txt
> > titulo_coluna1
> > titulo_coluna2
> > titulo_coluna3
> > titulo_coluna145
> > h 00:00:00
> > valor_coluna1
> > valor_coluna2
> > valor_coluna3
> > valor_coluna145
> > h 00:05:00
> > valor_coluna1
> > valor_coluna2
> > valor_coluna3
> > valor_coluna145
> > h 00:10:00
> > valor_coluna1
> > valor_coluna2
> > valor_coluna3
> > valor_coluna145
> > 
> > Como o exemplo é simples e toda linha começa com "h", simplifiquei a regex 
> > para pegar tudo que começa com "h", mas você pode melhorá-la. Então, o 
> > comando ficou assim:
> > 
> > $  csplit teste.txt '/^h/' {*}
> > 62
> > 69
> > 69
> > 69
> > 
> > Os números que você vê como retorno do csplit (62,69,69,69) são a 
> > quantidade de bytes que contém cada novo arquivo. Veja o resultado:
> > 
> > $ ls
> > pateste.txt  xx00  xx01  xx02  xx03
> > 
> > Ele criou os arquivos xx00 a xx03, com o seguinte conteúdo:
> > 
> > $ head -99 xx*
> > ==> xx00 <==
> > titulo_coluna1
> > titulo_coluna2
> > titulo_coluna3
> > titulo_coluna145
> > 
> > ==> xx01 <==
> > h 00:00:00
> > valor_coluna1
> > valor_coluna2
> > valor_coluna3
> > valor_coluna145
> > 
> > ==> xx02 <==
> > h 00:05:00
> > valor_coluna1
> > valor_coluna2
> > valor_coluna3
> > valor_coluna145
> > 
> > ==> xx03 <==
> > h 00:10:00
> > valor_coluna1
> > valor_coluna2
> > valor_coluna3
> > valor_coluna145
> > 
> > Viu, agora você tem um arquivo (xx00) com cabeçalho das colunas e, um 
> > registro por arquivo.
> > 
> > Finalizando, junte tudo com o paste.
> > 
> > $ paste -s x* > paste.txt
> > $ cat paste.txt
> > titulo_coluna1  titulo_coluna2  titulo_coluna3  titulo_coluna145
> > h 00:00:00      valor_coluna1   valor_coluna2   valor_coluna3   
> > valor_coluna145
> > h 00:05:00      valor_coluna1   valor_coluna2   valor_coluna3   
> > valor_coluna145
> > h 00:10:00      valor_coluna1   valor_coluna2   valor_coluna3   
> > valor_coluna145
> > 
> > Os títulos não batem com as colunas, pq não há titulo no arquivo original 
> > para a coluna das horas. Basta acertar isso depois.
> > 
> > Ajudou?
> >
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]