我在用着速度测试BASH 脚本中的 CLI 并尝试仅使用一行(如果可能)来获取输出。
Speedtest 的典型输出:
Speedtest by Ookla
Server: (censored)
ISP: (censored)
Latency: 93.85 ms (222.66 ms jitter)
Download: 85.75 Mbps (data used: 134.8 MB)
Upload: 5.68 Mbps (data used: 6.2 MB)
我想获取延迟、下载速度、上传速度和抖动。
Most ideal format:
Download Speed: xx Mbps
Upload Speed: xx Mbps
Latency: xx ms
Jitter: xx ms
我当前的测试代码使用了 2 个浪费的语句:
dl_speed=`speedtest | grep "Download: " | head -2 | tail -1 | awk {'print$2'} | cut -f1 -d:`
ul_speed=`speedtest | grep "Upload: " | head -2 | tail -1 | awk {'print$2'} | cut -f1 -d:`
echo "Download Speed: $dl_speed Mbps"
echo "Upload Speed: $ul_speed Mbps"
答案1
使用 GNU awk。我至少使用了一个空格 和(
作为字段分隔符。将其附加到您的speedtest
命令中。
| awk 'BEGIN{ FS=" +|\\(" };
/Download/{ dow=$3 " " $4 };
/Upload/ { upl=$3 " " $4 };
/Latency/ { lat=$3 " " $4 };
/jitter/ { jit=$6 " " $7 };
END{
print "Download Speed:", dow;
print "Upload Speed:", upl;
print "Latency:", lat;
print "Jitter:", jit
}'
输出到标准输出:
下载速度:85.75 Mbps 上传速度:5.68 Mbps 延迟:93.85 毫秒 抖动:222.66 毫秒
答案2
speedtest | tr -d '(:' | \
awk '/Download|Upload/ {print $1 " Speed: ",$2,$3}
/Latency/ {print $1":",$2,$3}
/jitter/ {print "Jitter:",$4,$5}'
给出
Latency: 93.85 ms
Jitter: 222.66 ms
Download Speed: 85.75 Mbps
Upload Speed: 5.68 Mbps
答案3
我可以访问的此工具 ( ) 的版本speedtest-cli
(Ubuntu 上为 2.1.2,macOS 和 OpenBSD 上为 2.1.3)未提供您显示的确切输出格式。但是,如果给出正确的命令行选项,它确实会提供 CSV 和 JSON 格式的输出。
这意味着您可以轻松地从 JSON 格式的输出中获取所需的数据,如下所示:
speedtest-cli --json |
jq -r '[
["Download (Mbps):", .download/1e6],
["Upload (Mbps):", .upload/1e6],
["Latency (ms):", .server.latency]
] | map(@tsv)[]'
这会从子对象中挑选出.download
键的值和.upload
值。下载和上传速度值以位/秒为单位,因此需要适当缩放。这些值以制表符分隔的方式与标题一起输出。.latency
.server
输出示例:
Download (Mbps): 88.32191644148061
Upload (Mbps): 93.34628783248138
Latency (ms): 10.756
我拥有的这个工具的变体似乎在任何输出模式下都没有输出“抖动”。
作为参考,完整的 JSON 输出可能如下所示
{
"download": 88321916.4414806,
"upload": 93346287.83248138,
"ping": 10.756,
"server": {
"url": "http://somehost.example.com:8080/speedtest/upload.php",
"lat": "XXX",
"lon": "YYY",
"name": "Thetown",
"country": "Thecountry",
"cc": "ZZ",
"sponsor": "Company",
"id": "XYZ",
"host": "somehost.example.com:8080",
"d": 156.5033515123062,
"latency": 10.756
},
"timestamp": "2021-12-04T20:12:20.816506Z",
"bytes_sent": 119447552,
"bytes_received": 110800036,
"share": null,
"client": {
"ip": "my-public-ip-number",
"lat": "XX",
"lon": "YY",
"isp": "provider",
"isprating": "3.7",
"rating": "0",
"ispdlavg": "0",
"ispulavg": "0",
"loggedin": "0",
"country": "ZZ"
}
}
speedtest-cli
您还可以使用以下命令解析 CSV 输出工具csvkit
:
{ speedtest-cli --csv-header; speedtest-cli --csv; } |
csvcut -c Download,Upload,Ping | csvlook
首先输出 CSV 标头speedtest-cli
(无论出于何种原因,都需要单独完成)。然后,它运行速度测试,提取Download
、Upload
和Ping
列(以 CSV 形式获取结果时似乎没有“延迟”列),并将生成的 CSV 重新格式化为 Markdown 格式的表。
结果可能看起来像这样
| Download | Upload | Ping |
| --------------- | --------------- | ------ |
| 88,649,466.475… | 93,164,137.292… | 10.193 |
渲染时看起来像这样:
下载 | 上传 | 平 |
---|---|---|
88,649,466.475… | 93,164,137.292… | 10.193 |
请注意,前两列中的数字以位/秒为单位。
答案4
在每个 Unix 机器上的任何 shell 中使用任何 awk,并且仅在需要打印数据名称时在代码中使用一次,因此您可以轻松地添加其他prt()
语句、修改它们、测试它们和/或为此或重新排序它们任何其他类似格式的数据,而无需对代码进行任何其他更改:
$ speedtest | awk '
{
gsub(/[:()]/,"")
tag2val[tolower($1)] = $2 " " $3
tag2val[tolower($6)] = $4 " " $5
}
END {
prt("Download Speed")
prt("Upload Speed")
prt("Latency")
prt("Jitter")
}
function prt(name, tag) {
tag = tolower(name)
sub(/ .*/,"",tag)
print name ":" OFS tag2val[tag]
}
'
Download Speed: 85.75 Mbps
Upload Speed: 5.68 Mbps
Latency: 93.85 ms
Jitter: 222.66 ms