shell脚本操作http请求的返回值——shell处理json格式数据

日常工作中,我们经常会遇到http请求会返回大量格式固定的数据,而我们只需要其中的一部分,那么怎么提取我们想要的字段呢。

这里会介绍一种用shell脚本处理http请求返回,或者处理json格式数据的方式。

这里我们用到了

  1. jq这个强大的命令行JSON处理器
  • 使用.data.list选择JSON数据中的list数组。
  • 使用map(select(...))对数组中的每个对象进行筛选,只保留那些element字段包含"/base"的对象。
  • 使用map(.num)选择每个筛选后对象的num字段。
  • 使用add将所有筛选出来的coverageClassTotalNumber相加,得到总和。
  • 使用-r选项让jq输出原始文本,而不是JSON格式的字符串。
  1. if - fi:判断语句,
  2. -ne:不等于的判断,
  3. echo: 输出信息到屏幕语句,
  4. -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
相关推荐
柒号华仔1 天前
「速通Shell」常用命令(中)——进程、网络与系统信息
shell
YuSun_WK1 天前
shell脚本
shell·脚本
柒号华仔5 天前
「速通Shell」Shell 脚本测试详解
shell
柒号华仔6 天前
「速通Shell」Shell 脚本模块化
shell
柒号华仔7 天前
「速通Shell」Shell编程的错误处理与日志
shell
柒号华仔8 天前
「速通Shell」Shell 数组、关联数组与 mapfile
shell
苏灿烤鱼10 天前
一套进程代替八件套,桌面更稳还是单点更大
linux·github·shell
茶本无香10 天前
通用报表自动化框架:Java调用Shell传参执行PostgreSQL SQL模板
java·sql·postgresql·shell
柒号华仔11 天前
「速通Shell」Shell 循环与遍历
shell·编程语言
十里春风_jzh11 天前
Tabby 修改版:更美观的现代终端
shell·tabby