Mover média em um arquivo de log com o awk ou outros utilitários unix?

4

Cenário:
Eu tenho um arquivo de log que tem um certo número de "classes" de entrada, como este:

R0 dx=0.00500 rb=0.00000 sn=1 3145.88 2.59 0.08 se=21315 id=16190  
R0 dx=0.00300 rb=-1.00000 sn=1 3150.40 2.38 0.05 se=21316 id=16191  
R1 dx=-0.00500 rb=1.00000 sn=-1 3155.14 2.54 0.05 se=21317 id=16192  
R1 dx=-0.02000 rb=-1.00000 sn=-1 3157.73 2.48 0.10 se=21318 id=16193  
R0 dx=-0.02000 rb=0.00000 sn=-1 3160.59 2.74 0.08 se=21319 id=16194   
R1 dx=0.00500 rb=1.00000 sn=1 3165.18 2.43 0.10 se=21320 id=16195     
R0 dx=0.00100 rb=-1.00000 sn=1 3167.84 2.53 0.05 se=21321 id=16196    
R3 dx=0.00100 rb=1.00000 sn=1 3170.11 0.10 0.10 se=21322 id=16197     

Estou monitorando este arquivo de log com tail -F ( Existe uma maneira de fazer a cauda -F beep? )

A minha pergunta é: Existe uma maneira de calcular o rácio deslizante (em movimento) de "número de linhas R1 para o número de linhas R0" para dar um exemplo? Além de imprimir essa proporção, eu preciso ser capaz de passá-la para alguma outra ferramenta, como o gnuplot, para plotá-la (embora isso possa ser um pouco complicado).

Obviamente, isso é uma coisa trivial para fazer em Python ou MATLAB ou Octave, mas estou muito ansioso para aprender a fazer isso no shell, acho que a parte complicada é passar os valores para um utilitário de plotagem para atualizar um gráfico .

    
por Ali 17.01.2012 / 18:37

2 respostas

2

Faça a cauda -F beep uma vez para cada linha:

bel='echo foo | tr -c -s '
windowsize=10
declare -ai isr0line isr1line r0sum r1sum i
for ((i=0; $i<$windowsize;i+=1)) ; do isr0line[$i]=0; isr1line[$i]=0; done
i=0
while read line
do
   r0sum=$(($r0sum - ${isr0line[$i]}))
   r1sum=$(($r1sum - ${isr1line[$i]}))
   case "$line" in
      R0*) isr0line[$i]=1; isr1line[$i]=0; ;;
      R1*) isr1line[$i]=1; isr0line[$i]=0; ;;
        *) isr0line[$i]=0; isr1line[$i]=0; ;;
   esac
   r0sum=$(($r0sum + ${isr0line[$i]}))
   r1sum=$(($r1sum + ${isr1line[$i]}))
   echo "R0 lines $r0sum  R1 lines $r1sum"
   i=$((($i + 1) % $windowsize))
done
7' '
bel='echo foo | tr -c -s '
windowsize=10
declare -ai isr0line isr1line r0sum r1sum i
for ((i=0; $i<$windowsize;i+=1)) ; do isr0line[$i]=0; isr1line[$i]=0; done
i=0
while read line
do
   r0sum=$(($r0sum - ${isr0line[$i]}))
   r1sum=$(($r1sum - ${isr1line[$i]}))
   case "$line" in
      R0*) isr0line[$i]=1; isr1line[$i]=0; ;;
      R1*) isr1line[$i]=1; isr0line[$i]=0; ;;
        *) isr0line[$i]=0; isr1line[$i]=0; ;;
   esac
   r0sum=$(($r0sum + ${isr0line[$i]}))
   r1sum=$(($r1sum + ${isr1line[$i]}))
   echo "R0 lines $r0sum  R1 lines $r1sum"
   i=$((($i + 1) % $windowsize))
done
7' '%pre%7'' tail -F file | sed "s/\$/$bel/"
7'' tail -F file | sed "s/\$/$bel/"

Quanto ao uso do shell para calcular uma média móvel, aqui está um script bash que rastreia o número de linhas R0 e R1 dentro de uma janela móvel de tamanho $ windowsize. Variáveis de rastreamento são r0sum e r1sum.

%pre%     
por 18.01.2012 / 00:25
3

Filtre seu log por meio disso:

awk '/^R1/ { r1++ } ; /^R0/ { r0++ } ; r0 > 0 {  print r1/r0 }'

Isso deve produzir a "taxa de execução" para cada linha após o primeiro R0.

E isso é para a taxa de deslizamento (desculpe por isso, eu tinha uma idéia errada do que "ratio" significava):

BEGIN { winsize=10; h=t=r0=r1=0 }
/^R0/ { r0++ }
/^R1/ { r1++ }
      { print r1 ":" r0 ; buf[h++] = $1 }
h - t >= winsize { r = buf[t]; delete buf[t++] }                   
r ~ /R1/ { r1-- }
r ~ /R0/ { r0-- }

A variável winsize contém o tamanho da janela. Os regexes são supérfluos aqui, mas eles salvam as teclas digitadas. Os testes podem ter sido $1 == "R0" e r == "R0" .

    
por 17.01.2012 / 21:02