[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?
> >
>