当前位置: 首页 > news >正文

linux下 jq 截取json文件信息

背景:通过‘登录名‘ 获取该对象的其他个人信息如名字。

环境准备:麒麟操作系统V10 + jq安装包

        jq安装包获取方式:yum install jq  或 使用附件中的rpm 或 git自行下载

https://github.com/stedolan/jq/releases/download/

实现过程介绍:

        (1)姓名文件(a.txt)包含登录名,以逗号为分割。

       (2)json文件(ryxx.json)包含登录名(即a文件的信息)、中文姓名、年龄等相关信息。

        (3)将a文件中的人员信息获取其对应的真实姓名

完整脚本1:

#!/bin/bash
logins=$(tr ',' '\n' < /data/jqtest/a.txt | xargs -n1)   

for dlm in $logins;do

        name=$(jq -r --arg uid "$dlm" ' .[] | select ( .loginId == $uid ) | .name // "null" ' /data/jqtest/ryxx.json )

        if [ -n "$name" ];then
                echo "$dlm $name"
        fi
done

完整脚本2【改进登录名存在空格和重复登录名问题】:

#!/bin/bash
file_a="/data/jqtest/a.txt"
file_json="/data/jqtest/ryxx.json"
mapfile -t logins < <(tr ',' '\n' < "$file_a")

for dlm in "${logins[@]}"; do
    dlm_display="${dlm:-null}"  # 空值替换为 null
    name=$( jq -r --arg uid "$dlm"  ' ([.[] | select(.loginId == $uid) | .name] | first) // "null" ' "$file_json" )
    echo "$dlm_display $name"
done

各代码解释:
logins=$(tr ',' '\n' < /data/jqtest/a.txt | xargs -n1)      

#将a文件的,替换为换行 xargs将换行分隔的每一行内容作为单独的参数传递给后续命令

#for循环读取logins存储的每行数据

for dlm in $logins;do

#此处存在问题,a文件如存在空格会被错误分割,则可以以数组方式进行存储

【 用法 mapfile -t  数组名 < <(输入命令)

mapfile -t logins < <(tr ',' '\n' < /data/jqtest/a.txt)
for dlm in "${logins[@]}"; do

# -z用于检查字符串是否为空,如果字符串长度为空,那么返回真。

# −n是检查字符串是否非空,如果字符串长度不为空,那么返回真。

jq -r --arg uid "$dlm"  ' ([.[] | select(.loginId == $uid) | .name] | first) // "null" ' "$file_json"

#jq命令将文件中的参数传入jq命令脚本中,通过.[] 将数组展开,将对象传递给select进行判断,然后取其的name,如果name为空,通过//返回空

 -r:输出原始字符串(去除 JSON 引号)

--arg: 动态传参,用于将外部变量传递给 jq 脚本。

【用法:jq --arg <变量名> <值> '<jq脚本>' 】如将 dlm 传给uid变量,通过jq脚本 判断json文件中.loginId 字段等于变量uid。

.[] 的作用:展开数组元素,将 JSON 数组中的每个元素逐个提取出来,形成数据流。执行 jq '.[]' 后 如下:

| first:first 是一个过滤器,用于 从输入流或数组中提取第一个元素。它的作用是提前终止处理,只保留第一个匹配的结果,常用于确保输出唯一性

// null:如果name字段为空或false,则替换为null 。

相关文章:

  • 前端数据模拟利器 Mock.js 深度解析
  • Etcd学习笔记
  • 通过一篇文章让你稳过计算机二级(C语言)
  • 为wordpress自定义一个留言表单并可以在后台进行管理的实现方法
  • 火语言RPA--指定PDF页另存为图片
  • Redis客户端
  • swift-5-汇编分析闭包本质
  • 2025年基于Zabbix主动发现机制实现Nacos服务动态监控
  • vue3中使用h()函数加载elementPlus 组件
  • 3个 Vue Scoped 的核心原理
  • Python中的*args和**kwargs:灵活参数处理的完全指南
  • Spring Boot 本地缓存工具类设计与实现
  • 【数据结构与算法】Java描述:第三节:栈与队列
  • 《苍穹外卖》SpringBoot后端开发项目重点知识整理(DAY1 to DAY3)
  • DeepSeek:中国AGI先锋,用技术重塑通用人工智能的未来
  • WPF基础知识61-80
  • 【python】模块和包相关知识
  • cpu 多级缓存L1、L2、L3 与主存关系
  • Easysearch 使用 AWS S3 进行快照备份与还原:完整指南及常见错误排查
  • 渗透测试之利用sql拿shell(附完整流程+防御方案)【下】
  • 用贝多芬八首钢琴三重奏纪念风雨并肩20年
  • 贞丰古城:新垣旧梦间的商脉与烟火
  • 全国省市县国土空间总体规划已基本批复完成,进入全面实施阶段
  • 郑钦文憾负高芙,止步WTA1000罗马站四强
  • 时隔3年俄乌直接谈判今日有望重启:谁参加,谈什么
  • 公元1058年:柳永词为什么时好时坏?