用于监控的 Speedtest-CLI 输出

用于监控的 Speedtest-CLI 输出

所以我对 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 为单位的数字。

相关内容