Almacenar valores integers de cadena en rrd

Quiero recostackr statistics de mi módem DSL cada 10 minutos. De acuerdo con muchos sitios web, es mejor usar rrd para esto. Mi módem (TD-W8968) tiene problemas con SNMP, así que he creado un script esperado para extraer statistics a través de telnet. El crontab para la colección ya está configurado. Mi problema es que mi salida de statistics se ve así después de recortar líneas innecesarias con cabeza, 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 

Puedes usar awk para manejar situaciones como esta. Por ejemplo, para extraer de su file raw los 2 numbers SNR y 2 Attn y darlos a rrd en el order ambos downs, entonces ambos ups:

 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 

La primera línea de awk coincide solo con la línea que comienza con "SNR". Por defecto, awk divide las líneas en campos separados por espacios en blanco. Los campos están numerados de 1. Entonces $ 3 es el campo con 21.8 en este ejemplo. El valor se guarda en una variable que nombramos arbitrariamente.

De manera similar, la línea del 2º toque solo coincide con la línea "A la última", pero como no hay espacio entre eso y "(dB)" nuestro primer número está en el campo $ 2.

La parte END se realiza después de que se hayan leído todas las líneas del file rawfile . Crea una cadena de datos para rrd (que necesita algo como N: 21.8: 26.0: …). Cada %s en la cadena de formatting se reemplaza por una de las variables que siguen al formatting.

awk vale la pena conocerlo. Es muy versátil