我想每 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 非常值得了解。它用途广泛。