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: 累加


三、示例

1、显示所有值

1)以方便阅读形式显示

cat t.json | jq

用 cat 和给 | 管道方式
image


jq . t.json

直接打开文件
image


2)一行显示值

cat t.json | jq  -c

image


2、查找所有键(keys)

cat t.json | jq  'keys'

image


3、获取env_AB的子键(keys)

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

image


4、获取子键(keys) ,去掉 [] 方括号

cat t.json | jq ".env_AB| keys[] "

image


5.显示所有子值(value)

cat t.json | jq '.env_AB[]'

image


cat t.json | jq '.env_AB'

image


6、去掉所有值 的双引号

cat t.json | jq -r .env_AB[]

image


7、统计键值总数

cat t.json | jq  length

image


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

image


8、获取指定键的值

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

image


9、获取元素类型

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

image


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]
image

image


11、获取 json 中所有 key 和 value

cat t.json | jq 'to_entries|map("\(.key)=\(.value|tostring)")|.[]'

image


12、取 [] 方括号数组 Obgect

https://www.cnblogs.com/v5captain/p/16932237.html

cat t.json | jq '.env_AB.RULE_DB[0]'

image


13、取 [] 方括号数组 Obgect 第一个 RULE_DB_1 键的值

cat t.json | jq '.env_AB.RULE_DB[0].RULE_DB_1'

image


四、示例

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"
}

五、示例

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"
}

2、显示所有键

cat t1.json | jq -r 'keys[]'

image


六、示例

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 (数字)类型。
字符串,不可以进行加减法运算
数字, 可以进行加减法运算


1、要将数组中的所有年龄加1

jq 'map(.age + 1)' t2.json

image

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


2、累加所有的 age 总数

jq 'reduce .[] as $item (0; . + $item.age)' t2.json

image


3、sort_by 按 .age 内容排序

jq 'sort_by(.age)' t2.json 

age 的值 18、19、20 带双引号 和 不带双引号 都可以排序
image


4、数组切片:显示前两个

jq '.[:2]' t2.json

image


5、数组切片:不显示后两个

jq '.[:-2]' t2.json

image


6、数组切片:显示第2个以后的

jq '.[2:]' t2.json

image


7、数组切片:显示倒数 第一个

jq '.[-1:]' t2.json

image


8、数组切片:显示 第0个到 第1个

jq '.[0:2]' t2.json

image


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



posted @ 2023-08-23 17:48  悟透  阅读(2926)  评论(0编辑  收藏  举报