grep 用于速度测试输出中的多个字符串

grep 用于速度测试输出中的多个字符串

我在用着速度测试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(无论出于何种原因,都需要单独完成)。然后,它运行速度测试,提取DownloadUploadPing列(以 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

相关内容