日常工作中,我们经常会遇到http请求会返回大量格式固定的数据,而我们只需要其中的一部分,那么怎么提取我们想要的字段呢。
这里会介绍一种用shell脚本处理http请求返回,或者处理json格式数据的方式。
这里我们用到了
jq
这个强大的命令行JSON处理器
- 使用
.data.list
选择JSON数据中的list数组。 - 使用
map(select(...))
对数组中的每个对象进行筛选,只保留那些element字段包含"/base"的对象。 - 使用
map(.num)
选择每个筛选后对象的num字段。 - 使用
add
将所有筛选出来的coverageClassTotalNumber相加,得到总和。 - 使用
-r
选项让jq输出原始文本,而不是JSON格式的字符串。
if - fi
:判断语句,-ne
:不等于的判断,echo
: 输出信息到屏幕语句,-z
:字符串长度为0的判断,
例如:有一个url,这个url的id参数是可支持修改传入的:
bash
https://abcdefg.com/api?id=$id
他的返回为:
bash
{
"status": 200,
"message": "success",
"data": {
"total": 80,
"list": [
{
"element": "/base",
"pid": 1,
"id": 2,
"type": 3,
"num": 11
},
{
"element": "/handler",
"pid": 1,
"id": 29,
"type": 3,
"num": 132
},
...
...
...
{
"element": "/dao",
"pid": 1,
"id": 89,
"type": 3,
"num": 231
} ,
{
"element": "/runner",
"pid": 1,
"id": 89,
"type": 3,
"num": 145
}
]
},
"timestamp": 1716818758408
}
这个返回值的"data"有上千行,而我门只需要其中所有"element"为"/base"路径,且字段为"num"的值的和。
这时,我们就可以用一个shell脚本来实现我们的诉求。
count.sh代码如下:
bash
#!/bin/bash
# 检查是否提供了参数
if [ -z "$1" ]; then
echo "请提供参数."
exit 1
fi
id="$1"
# URL
url="https://abcdefg.com/api?id=$id"
# 发送curl请求并捕获输出到临时文件
curl --location "$url" --header 'accept: */*' --header 'accept-language: zh-CN,zh;q=0.9' > temp_response.json
# 检查curl的返回值,确保请求成功
if [ $? -ne 0 ]; then
echo "curl请求失败"
exit 1
fi
# 使用jq计算符合条件的coverageTotalNumber之和
totalNumber=$(jq -r ".data.list | map(select(.element | contains("base"))) | map(.num) | add" temp_response.json)
# 检查jq命令是否成功执行
if [ $? -ne 0 ]; then
echo "jq命令执行失败"
exit 1
fi
# 打印结果或保存到文件
echo "符合条件的总数为: $totalNumber%"
# 如果需要保存到文件,可以这样做:
echo "$totalNumber" > totalNumber.txt
# 清理临时文件
rm temp_response.json
可以在终端使用下面命令来执行
bash
sh count.sh 123
- 如果你收到错误 jq: command not found,这意味着你的系统中没有安装 jq 工具。jq 是一个强大的命令行 JSON 处理器,它允许你解析、过滤、查询和修改 JSON 数据。
为了解决这个问题,你需要安装 jq。以下是在不同操作系统上安装 jq 的方法:
在 Debian/Ubuntu 系统上安装 jq:
使用 apt-get 安装:
bash
sudo apt-get update
sudo apt-get install jq
在 Red Hat/CentOS 系统上安装 jq:
使用 yum 安装(对于较新版本的 CentOS,可能需要使用 dnf 代替 yum):
bash
sudo yum install jq
sudo dnf install jq
在 macOS 上安装 jq:
使用 Homebrew 安装:
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install jq