所以我对 Linux 还很陌生,我真的不知道该怎么做。
所以我想为我们的监控工具提供有用的输出speedtest-cli
。我们必须监控多个位置的下载和上传速度。
我制作了以下脚本,用 awk 中断输出并给出所需的数字(在这种情况下,只有数字本身,数字前后没有文本)
SP=$(speedtest-cli 2>&1)
if [ $? -eq 0 ]
then
Down=$(echo $SP | gawk '{split($0,a,":"); print a[3]}' | \
gawk '{split($0,a," "); print a[1]}')
fi
echo "$Down"
这个脚本按照我想要的方式工作。但是,我真的想要一个只返回数字的解决方案。那么是否可以搜索“下载:90.00 Mbit/s”行并获取 90.00 并将其输出?
编辑:
对于任何对我在那里写的脚本感兴趣的人。它输出<WAN_IP>,<Download>,<Upload>
,如果没有连接它输出0.0.0.0,0,0
#!/bin/sh
SP=$(speedtest-cli 2>&1)
if [ $? -eq 0 ]
then
From=$(echo "$SP" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b")
Down=$(echo "$SP" | gawk '{if (match($0,/Download: ([[:digit:]]+\.[[:digit:]]+) Mbit\/s/,a)>0) print a[1]}')
Up=$(echo "$SP" | gawk '{if (match ($0,/Upload: ([[:digit:]]+\.[[:digit:]]+) Mbit\/s/,a)>0) print a[1]}')
else
From="0.0.0.0"
Down="0"
Up="0"
fi
echo "$From,$Down,$Up"
答案1
由于您明确使用gawk
,因此您可以使用该match()
函数来查找模式“ Download:
number Mbit/s
”并提取在字符串中找到的该模式的实际值,如下所示:
gawk '{if (match($0,/Download: ([[:digit:]]+\.[[:digit:]]+) Mbit\/s/,a)>0) print a[1]}'
这会
- 确定该模式是否首先被发现,并且
( ... )
将RegExp 的所有封闭子组放入数组的元素中a
然后您可以简单地使用条目 1 (因为 RegExp 中只有一个这样的子组)。
答案2
speedtest-cli
有一个--simple
使输出变得简单的开关(尝试speedtest-cli --help
了解更多信息):
# speedtest-cli --simple --no-upload
Ping: 18.833 ms
Download: 33.88 Mbit/s
Upload: 0.00 Mbit/s
因此我们可以得到数字形式的仅下载速度:
# speedtest-cli --simple --no-upload|grep "^Download:"|cut -d" " -f2
34.92
这可以--no-upload
通过不测试上传速度来节省一些时间,grep
只提取下载行,并cut
提取第二个字段,即以 Mbit/s 为单位的数字。