目录

linux下-jq-截取json文件信息

目录

linux下 jq 截取json文件信息

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

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

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

实现过程介绍:

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

https://i-blog.csdnimg.cn/direct/cf022210b0e648199d1e82aee4bddf62.png

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

https://i-blog.csdnimg.cn/direct/5ef3e882611e4c1db001ac15ea3d8d38.png

(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 ‘.[]’ 后 如下:

https://i-blog.csdnimg.cn/direct/78f4c1eeafd642b7a3b83249ee86aad0.png

https://i-blog.csdnimg.cn/direct/8004cada971b49ecbbf0bde84cb9481e.png

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

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