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

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

Re: [shell-script] Expressão Regular para formatar log


From: jimmy
Subject: Re: [shell-script] Expressão Regular para formatar log
Date: Sat, 25 Sep 2010 01:51:56 -0300
User-agent: Mutt/1.4.2.3i

On Thu, Sep 23, 2010 at 08:05:53PM -0000, andelnyr wrote:
> 
> 
> 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:
> 
> #!/bin/bash
> tmp=( $(cat "$1" | tr "*" "&") ) #troquei o "*" por "&" para não dar erros!
> echo "${tmp[*]}" > vetor.log
> 
> #FAZER LINHA TITULOS
> echo "HORA $(cat vetor.log | cut -d " " -f9-154)" > bd.log
> 
> #FAZER LINHA DE VALORES
> for n in $(seq 154 148 42630)
> do
> inicio=$(expr "$n" + 2)
> fim=$(expr "$n" + 148)
> cat vetor.log | cut -d " " -f$inicio-$fim >> bd.log
> done
> 
> ok * funcionou e já utilizo os logs para as aplicações que necessito. Agora 
> com
> calma estou querendo entender como usar expressões regulares para realizar a
> mesma ação, mas as minhas tentativas foram infrutíferas. Peço aos 
> participantes
> mais experientes alguma dica, por onde começar.
> 
> Desde já agradeço.
> 

Não consegui entender muito  bem o que você quer, rodei  o seu script em
cima do exemplo de dados de entrada  mas não obtive a saída mostrada, me
parece que você quer reformatar a saída de um arquivo log para algo mais
legível,  só  alerto  para o  fato  de  que,  uma  vez que  não  há  uma
especificação  documentada para  se construir  um parser  adequadamente,
recomento que você guarde os logs oficiais do equipamento para possíveis
consultas. No  caso do uso  de expressões regulares, poderia  também ter
postado aquilo que tentou e não deu certo, fica mais fácil para corrigir
do que  criar algo  do zero, ainda  mais neste caso,  que para  mim, não
ficou muito claro como proceder.

Segundo o exemplo de dados de entrada  e o seu script, parece que o log,
ao ser iniciado, cria um cabeçalho  com alguns dados mais 149 colunas de
títulos, insere a data, e 149 dados que coletou naquele momento, e assim
por diante. Se for isso realmente, algo como:

sed '1,2d;
     3s/^/HORA /;
     :L;
     N;
     /h\s\([0-9][0-9]:[0-9][0-9]\)/ {
         s//\1/;
         P;
         D
    };
    s/\n/ /;
    t L' seu_arquivo_de_log.txt

talvez ajude a resolver o seu problema.


-- 
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------


reply via email to

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