[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."
------------------------------