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


From: andelnyr
Subject: Re: Expressão Regular para formatar log
Date: Mon, 11 Oct 2010 16:53:54 -0000
User-agent: eGroups-EW/0.82

Prezado Cristiano

Desculpe a demora em lhe agradecer a sua sugestão para a solução do problema 
que apresentei aqui na lista, mas só agora que eu via sua resposta.

Interessantíssima a sua sugestão e estou testando um script modificado com ela 
nesse momento.

Logo mais eu posto o resultado.

Abraços
> 
> Caro andelnyr,
> 
> O que você precisa é transpor linhas para colunas.
> 
> Analisando o seu exemplo de arquivo, percebi que há um padrão que pode ser 
> usado como delimitado dos registro do seu arquivo.
> 
> Cada novo registro começa com um "h " seguido da hora no formato hh:mm:ss.
> 
> Se realmente for assim, dois comandinhos resolvem seu problema: csplit e 
> paste.
> 
> O csplit é parecido com o split, mas ao invés de quebrar o arquivo com base 
> em uma medida fixa, quebra quando encontra uma linha com determinado padrão 
> (regex). Para cada ocorrência do padrão ele criar um arquivo novo com o nome 
> em xx00, onde 00 vai crescendo à medida que novos arquivos vão sendo criados.
> 
> Depois de dividir o arquivo em vários, um para cada registro (faça isso 
> preferencialmente em um diretório vazio), basta juntá-los com paste.
> 
> Seu arquivo tem linhas antes de começar os registro que você provavelmente 
> irá querer tratar antes de fazer o que estou sugerindo.
> 
> 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]