Armazenando valores inteiros da string em rrd

1

Quero coletar estatísticas do meu modem DSL a cada 10 minutos. De acordo com muitos sites, é melhor usar o rrd para isso. Meu modem (TD-W8968) luta com o SNMP, então eu fiz um script esperar para obter estatísticas via telnet. O crontab para coleta já está configurado. Meu problema é que minha saída de estatísticas se parece com isso depois de cortar linhas desnecessárias com a cabeça etc.:

Status: Showtime
Last Retrain Reason:    0
Last initialization procedure status:   0
Max:    Upstream rate = 1080 Kbps, Downstream rate = 11128 Kbps
Channel:        FAST, Upstream rate = 512 Kbps, Downstream rate = 2048 Kbps

Link Power State:       L0
Mode:                   G.DMT 
TPS-TC:                 ATM Mode
Trellis:                ON
Line Status:            No Defect
Training Status:        Showtime
                Down            Up
SNR (dB):        21.8            12.0
Attn(dB):        26.0            15.0
Pwr(dBm):        5.1             4.0
    
por Wilhelm Erasmus 05.09.2015 / 14:34

1 resposta

2

Você pode usar o awk para lidar com situações como essa. Por exemplo, para extrair do seu arquivo bruto apenas os 2 números SNR e 2 Attn e dá-os a rrd na ordem dos dois downs, depois os dois altos:

awk '/^SNR/  { snrdown = $3; snrup = $4; }
     /^Attn/ { attndown = $2; attnup = $3; }
     END     { data = sprintf("N:%s:%s:%s:%s", snrdown, attndown, snrup, attnup);
               system("rrdtool update " data " myrrdfile");
             }' <rawfile

A primeira linha do awk corresponde apenas à linha que começa com "SNR". Por padrão, o awk divide as linhas em campos separados por espaço em branco. Os campos são numerados de 1. Portanto, $ 3 é o campo com 21,8 neste exemplo. O valor é salvo em uma variável que nomeamos arbitrariamente.

Da mesma forma, a segunda linha do awk corresponde apenas à linha "Attn", mas como não há espaço entre ela e "(dB)", nosso primeiro número está no campo $ 2.

A parte END é feita após todas as linhas terem sido lidas do arquivo rawfile . Ele cria uma string de dados para rrd (que precisa de algo como N: 21.8: 26.0: ...). Cada %s na string de formato é substituído por uma das variáveis após o formato.

vale a pena conhecer o awk. É muito versátil.

    
por 05.09.2015 / 15:10