将字符串中的整数值存储在 rrd 中

将字符串中的整数值存储在 rrd 中

我想每 10 分钟从 DSL 调制解调器收集一次统计数据。根据许多网站的说法,最好使用 rrd 来实现此目的。我的调制解调器(TD-W8968)无法使用 SNMP,因此我编写了一个预期脚本来通过 telnet 提取统计信息。收集的 crontab 已经设置好了。我的问题是,在用头等裁剪不必要的行后,我的统计输出看起来像这样:

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

答案1

您可以使用awk来处理这样的情况。例如,要从原始文件中提取 2 个 SNR 和 2 个 Attn 数字,并将它们按照先降后升的顺序提供给 rrd:

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

awk 的第一行仅匹配以“SNR”开头的行。默认情况下,awk 将行分割成由空格分隔的字段。字段从 1 开始编号。因此,本例中 $3 是 21.8 的字段。该值保存在我们任意命名的变量中。

类似地,第二个 awk 行仅匹配“Attn”行,但由于该行和“(dB)”之间没有空格,因此我们的第一个数字位于字段 $2 中。

从文件中读取所有行后完成 END 部分rawfile。它为rrd创建一串数据(需要类似N:21.8:26.0:...)。格式字符串中的每个都%s被格式后面的变量之一替换。

awk 非常值得了解。它用途广泛。

相关内容