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: Cristiano
Subject: Re: Expressão Regular para formatar log
Date: Fri, 24 Sep 2010 12:42:05 -0000
User-agent: eGroups-EW/0.82

--- Em address@hidden, "andelnyr" <andelnyr@...> escreveu
>
> Prezados
> 
> Um determinado equipamento que trabalho produz um log enorme durante o seu 
> funcionamento. O formato é:
> 
> dia_da_semana mês dia_do_mês 00:00:00 ano
> c dado_de_controle1 dado_de_controle2
> 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
> .
> .
> .
> 
> Ou seja o equipamento colhe valores do sistema de 5 em 5 minutos e o que eu 
> desejo fazer é transformar este log de quase 50000 linhas em um arquivo assim
> 
> HORA titulo1 titulo2 tirulo3... titulo145
> 00:00:00 valor1 valor2 valor3… valor145
> 00:05:00 valor1 valor2 valor3... valor 145
> 00:10:00 valor1 valor2 valor3... valor 145
> .
> .
> .
> 23:55:00 valor1 valor2 valor3... valor 145
> 
> O que eu já fiz:
> 
> Em primeiro lugar tentei identificar os caracteres separadores e além do "new 
> line" no final de cada linha encontrei de 1 a 7 espaços e em alguns casos o 
> TAB no começo da linha de cada título, pois seja la quem foi que bolou esta 
> formatação alinhou os nomes "pela direita".
> 
> O script ficou:

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]