Shell脚本如何过滤获取numberOfAccessSchedules>0的userAccessId
Shell脚本修改方案
直接通过jq原生能力完成字段过滤,无需串联grep、awk、sed等文本处理命令,既可以减少管道处理的性能损耗,也能避免文本匹配规则在JSON结构变动时失效。
核心修改逻辑
- 保留原有鉴权接口调用获取
access_token的逻辑无需改动 - 调用useraccesses分页接口拿到JSON响应后,直接在jq阶段完成两个操作:
- 遍历
useraccesses数组下的所有条目,通过select()方法筛选出numberOfAccessSchedules字段值大于0的条目 - 提取筛选后条目的
userAccessId值,直接写入目标文件
- 遍历
- 如果接口是分页返回,增加简单的翻页循环即可拉取全量符合条件的数据
替换后的完整核心代码
# 1. 鉴权获取token(替换成你原有的鉴权参数、接口地址即可) ACCESS_TOKEN=$(curl -s -X POST "http://你的鉴权接口路径" \ -H "Content-Type: application/json" \ -d '{"username":"你的账号","password":"你的密码"}' \ | jq -r '.access_token') # 2. 初始化结果文件,清空旧内容 > alluseraccessId.txt # 3. 分页拉取+过滤写入(如果是不分页接口,去掉循环直接单次调用即可) PAGE=1 # 每页条数根据接口实际支持的参数调整 PAGE_SIZE=100 while true; do # 调用当前页接口 RESP=$(curl -s -X GET "http://你的useraccesses查询接口路径?page=${PAGE}&pageSize=${PAGE_SIZE}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}") # 提取当前页符合条件的userAccessId追加写入文件 echo "${RESP}" | jq -r '.useraccesses[] | select(.numberOfAccessSchedules > 0) | .userAccessId' >> alluseraccessId.txt # 判断是否到达最后一页,totalPages为接口返回的总页数字段,根据实际接口返回结构调整 CURRENT_TOTAL=$(echo "${RESP}" | jq -r '.totalPages') if [ ${PAGE} -ge ${CURRENT_TOTAL} ]; then break fi PAGE=$((PAGE+1)) done
效果验证
以如下JSON响应结构为例:
{ "totalPages": 1, "useraccesses": [ {"userAccessId": "u001", "numberOfAccessSchedules": 0}, {"userAccessId": "u002", "numberOfAccessSchedules": 3}, {"userAccessId": "u003", "numberOfAccessSchedules": 1}, {"userAccessId": "u004", "numberOfAccessSchedules": 0} ] }
最终alluseraccessId.txt写入内容为:
u002 u003
完全符合仅提取numberOfAccessSchedules大于0条目对应ID的需求。
内容的提问来源于stack exchange,提问作者Dipesh Kumar Sahu
相关产品推荐
相关产品推荐

