Linux/Bash如何从curl输出提取变量?附命令行测速脚本示例
嘿,我来帮你搞定这两个Linux/Bash下的实用技巧,都是日常折腾机器或者做运维时常用的:
1. 从curl命令输出中提取变量(Linux/Bash环境)
当你用curl调用接口或者获取文本内容后,经常需要从中提取特定的变量值,这里给你几种实用的方法:
- 方法一:grep + awk组合(适合键值对格式输出)
如果curl返回的是类似key: value或者JSON这种结构化内容,用这个组合准没错。比如要从测速脚本的输出里抓下载速度:
# 先把curl结果存到临时变量,方便后续处理 speedtest_result=$(curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -) # 提取下载速度数值 download_speed=$(echo "$speedtest_result" | grep "下载速度:" | awk -F':| ' '{print $2}') echo "提取到的下载速度:$download_speed Mbit/s"
- 方法二:sed精准匹配(适合固定格式的文本)
sed擅长字符串替换和提取,只要你能匹配到目标内容的前后特征,就能轻松抠出想要的值:
# 直接一步到位提取下载速度 download_speed=$(curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python - | sed -n 's/^下载速度:\([0-9.]*\) Mbit/s/\1/p') echo "下载速度:$download_speed Mbit/s"
- 方法三:Bash内置字符串处理(轻量无依赖)
如果不想用额外工具,纯Bash也能搞定。先把输出按行存到数组,再通过字符串截取提取:
# 将测速输出按行存入数组(避免子shell问题) IFS=$'\n' read -d '' -r -a output_lines < <(curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -) # 找到包含下载速度的行(这里假设是倒数第二行,你可以根据实际输出调整) download_line=${output_lines[-2]} # 截取数值部分:先去掉"下载速度:"前缀,再去掉" Mbit/s"后缀 download_speed=${download_line#*下载速度:} download_speed=${download_speed% Mbit/s} echo "提取到的下载速度:$download_speed Mbit/s"
2. 命令行一键测速脚本
如果你想快速测试自己的网络上传下载速度,直接在终端运行下面的命令就行,不需要额外安装软件:
curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -
运行后会输出类似这样的内容:
正在获取speedtest.net配置信息...
正在测试,网络来自XXXX(X.X.X.5)...
正在获取speedtest.net服务器列表...
基于Ping值选择最优服务器...
由XXXX(XX)托管 [0.54 km]: 3.513 ms
正在测试下载速度................................................................................
下载速度:191.68 Mbit/s
正在测试上传速度................................................................................
上传速度:45.23 Mbit/s
小技巧:要是觉得每次输入这么长麻烦,可以给它整个别名,以后一键调用:
# 把测速命令添加到bash配置文件,永久生效 echo 'alias speedtest="curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -"' >> ~/.bashrc # 让配置立即生效 source ~/.bashrc
之后只要在终端敲个speedtest,就能马上开始测速啦!
内容的提问来源于stack exchange,提问作者Nkk




