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
相关推荐
leaf9z5 小时前
阿里云ECS在线扩容磁盘
阿里云·云计算·shell
gfdgd xi2 天前
deepin 终端,但是版本是 deepin 15 的
linux·python·架构·ssh·bash·shell·deepin
大米粥哥哥6 天前
Qt QProcess基于Linux的命令管道符号无效问题【已解决】
linux·qt·shell·qprocess·1024程序员节·管道符号
缘友一世12 天前
深入理解Shell与反弹Shell:从原理到实战
linux·网络安全·shell
hour_go14 天前
Linux Shell 实验一:数据采集与脚本调试错误总结
linux·笔记·bash·shell·实验报告·错误排查
struggle202515 天前
AxonHub 开源程序是一个现代 AI 网关系统,提供统一的 OpenAI、Anthropic 和 AI SDK 兼容 API
css·人工智能·typescript·go·shell·powershell
shark16 天前
无需放弃变更、关闭占用程序!用暂存区和 git底层命令实现 Git 变更备份
git·shell·自动化运维
vortex517 天前
Shell脚本技巧:去除文件中字符串两端空白
linux·bash·shell·sed·awk
九皇叔叔18 天前
Linux Shell 函数:从定义到实战,让脚本更高效
linux·运维·chrome·shell
刘某的Cloud19 天前
SSH命令建立隧道
linux·运维·ssh·系统·shell