背景:通过‘登录名‘ 获取该对象的其他个人信息如名字。
环境准备:麒麟操作系统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 。