shell jq命令,解析 json 文件
全局
cat t.json
{
"env_AB":{
"DB_PATH":"/bin/data",
"DB_NAME":"aa.db",
"RULE_DB":[
{
"RULE_DB_1":"bb_rules1.db",
"RULE_DB_2":"bb_rules2.db",
"RULE_DB_3":"bb_rules3.db",
"RULE_DB_4":"bb_rules4.db"
}
]
}
}
一、参数说明
-r: 去掉结果中的 " 双引号
-c: 在一行显示
二、函数说明
length: 统计键(值)总数
type: 获取元素类型
to_entries: 条目
map:数组中的元素进行映射转换
to_entries:
from_entries:
keys: 查找json中所有的键, 默认获取第一层键,指定键则获取子键
has:用来是判断是否存在某个key
sort_by: 数组排序
reduce: 累加
三、示例
3.1、显示所有值
1)以方便阅读形式显示
cat t.json | jq
用 cat 和给 | 管道方式

jq . t.json
直接打开文件

2)一行显示值
cat t.json | jq -c

3.2、查找所有键(keys)
cat t.json | jq 'keys'

3.3、获取env_AB的子键(keys)
cat t.json | jq ".env_AB| keys"

3.4、获取子键(keys) ,去掉 [] 方括号
cat t.json | jq ".env_AB| keys[] "

3.5.显示所有子值(value)
cat t.json | jq '.env_AB[]'

cat t.json | jq '.env_AB'

3.6、去掉所有值 的双引号
cat t.json | jq -r .env_AB[]
或
cat t.json | jq .env_AB[] | sed 's/\"//g'

3.7、统计键值总数
cat t.json | jq length

cat t.json | jq ".env_AB | length"

3.8、获取指定键的值
cat t.json | jq ".env_AB.DB_PATH"

3.9、获取元素类型
cat t.json | jq ".env_AB| type"

3.10、取 [] 方括号中的值
cat t.json | jq ".env_AB.RULE_DB[]"
或
cat t.json | jq ".env_AB.RULE_DB[0]"
json文件中 env_AB里只有一个带方括号的 RULE_DB ,因为 json 是从0开始,所以是写 [0]


3.11、获取 json 中所有 key 和 value
cat t.json | jq 'to_entries|map("\(.key)=\(.value|tostring)")|.[]'

3.12、取 [] 方括号数组 Obgect
https://www.cnblogs.com/v5captain/p/16932237.html
cat t.json | jq '.env_AB.RULE_DB[0]'

3.13、取 [] 方括号数组 Obgect 第一个 RULE_DB_1 键的值
cat t.json | jq '.env_AB.RULE_DB[0].RULE_DB_1'

四、示例
4.1、key 和 value 的值组合
http://www.manongjc.com/detail/32-jaokxamdvlhombq.html
https://www.cnblogs.com/yangxinrui/p/16314070.html
1)文件内容
cat 1.json | jq to_entries
[
{
"key": "honesty",
"value": "Apple Jack"
},
{
"key": "laughter",
"value": "Pinkie Pie"
},
{
"key": "loyalty",
"value": "Rainbow Dash"
}
]
2)用函数执行结果
cat 1.json | jq to_entries | jq from_entries
{
"honesty": "Apple Jack",
"laughter": "Pinkie Pie",
"loyalty": "Rainbow Dash"
}
五、示例
5.1、文件内容
https://www.nuomiphp.com/eplan/226372.html
cat t1.json
{
"Archiver-Version": "Plexus Archiver",
"Build-Id": "",
"Build-Jdk": "1.7.0_07",
"Build-Number": "",
"Build-Tag": "",
"Built-By": "cporter",
"Created-By": "Apache Maven",
"Implementation-Title": "northstar",
"Implementation-Vendor-Id": "com.test.testPack",
"Implementation-Version": "testBox",
"Manifest-Version": "1.0",
"appname": "testApp",
"build-date": "02-03-2014-13:41",
"version": "testBox"
}
5.2、显示所有键
cat t1.json | jq -r 'keys[]'

六、示例
6.1、文件内容
https://www.jb51.net/jiaoben/292780fu4.htm
cat t2.json
[{
"id": "1",
"name": "zhangsan",
"age": 18
}, {
"id": "2",
"name": "lisi",
"age": 19
}, {
"id": "3",
"name": "wangwu",
"age": 20
}]
注意: age 的值 18、19、20 带双引号是 string(字符串)类型; 不带双引号是 num (数字)类型。
字符串,不可以进行加减法运算
数字, 可以进行加减法运算
6.1、要将数组中的所有年龄加1
jq 'map(.age + 1)' t2.json

age 的值 18、19、20 带双引号,执行就会报错(提示是 string 类型)

6.2、累加所有的 age 总数
jq 'reduce .[] as $item (0; . + $item.age)' t2.json

6.3、sort_by 按 .age 内容排序
jq 'sort_by(.age)' t2.json
age 的值 18、19、20 带双引号 和 不带双引号 都可以排序

6.4、数组切片:显示前两个
jq '.[:2]' t2.json

6.5、数组切片:不显示后两个
jq '.[:-2]' t2.json

6.6、数组切片:显示第2个以后的
jq '.[2:]' t2.json

6.7、数组切片:显示倒数 第一个
jq '.[-1:]' t2.json

6.8、数组切片:显示 第0个到 第1个
jq '.[0:2]' t2.json

七、null值处理
7.1 使用默认值
如果你希望在字段值为null时使用一个默认值,你可以使用jq的//运算符。例如,假设你有以下JSON数据:
{
"name": "Alice",
"age": null
}
你可以这样使用jq来设置一个默认值(比如"unknown")给age字段:
echo '{"name": "Alice", "age": null}' | jq '.age // "unknown"'
1、
参考、来源:
https://www.jianshu.com/p/98b1b3ce2e29 (图文说明大全)
https://blog.csdn.net/victoria_hong/article/details/78884884
https://wenku.csdn.net/answer/950342be2ab949b2889f2b894c2b0883
https://tool.4xseo.com/a/1616.html
https://www.baidu.com/s?ie=UTF-8&wd=shell+jq命令null&tn=98012088_21_dg&ch=1
浙公网安备 33010602011771号