当前位置:   article > 正文

linux shell json操作命令 jq 简介_linux shell jq 后面插入

linux shell jq 后面插入

jq命令允许直接在命令行下对JSON进行操作,包括分片、过滤、转换等 ,jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;在linux系统中也可以直接用yum安装。

下载地址 https://stedolan.github.io/jq/download/

本文主要介绍其使用,默认是已经安装好的,没有安装的,请自行安装。

常用选项

  1. -c 紧凑输出json数据
  2. -e 根据输出结果设置命令退出状态码
  3. -s 读取所有输入到一个数组
  4. -r 输出原始字符串,而不是一个JSON格式
  5. -C 高亮显示
  6. -M 单色显示
  7. -S 排序对象
  8. --tab 使用tab缩进

现在先准备json串,如下kumufengchun.json:

{"name":"kumufengchun","age":"","city":"beijing","email":"kumufengchun@gmail.com","date":"Thursday","country":"China","company":["baidu","google","alibaba"]}"

如下test.json:

[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]

1.用jq .直接查看

jq . kumufengchun.json

或者

cat kumufengchun.json | jq .

输出如下:

  1. [root@localhost ~]$ cat kumufengchun.json | jq .
  2. {
  3. "name": "kumufengchun",
  4. "age": "",
  5. "city": "beijing",
  6. "email": "kumufengchun@gmail.com",
  7. "date": "Thursday",
  8. "country": "China",
  9. "company": [
  10. "baidu",
  11. "google",
  12. "alibaba"
  13. ]
  14. }

是已经格式化的json数据串,在linux系统下还高光显示,key和value用不同的颜色表示,如下图:

2.输出某个字段或者某个索引的值

语法:jq  '.<key>'  ,这里key是字段名称

  1. [root@localhost ~]$ jq .name kumufengchun.json
  2. "kumufengchun"
  3. [root@localhost ~]$ jq '.name' kumufengchun.json
  4. "kumufengchun"
  5. [root@localhost ~]$ jq '.company' kumufengchun.json
  6. [
  7. "baidu",
  8. "google",
  9. "alibaba"
  10. ]

3.输出数组的值

语法:jq '.[<value>]' ,这里value是数组的索引整数值

  1. [root@localhost ~]$ jq '.company[1]' kumufengchun.json
  2. "google"
  3. [root@localhost ~]$ jq '.company[2]' kumufengchun.json
  4. "alibaba"

4.输出列表、数组的一部分,对其进行切片

语法:jq '.<list-key>[s:e]',返回的是数组或者列表的index从s开始(包括s)到e结束(不包括e)

  1. [root@localhost ~]$ jq '.company[0:2]' kumufengchun.json
  2. [
  3. "baidu",
  4. "google"
  5. ]

也可以省略开始的index,只有结束的index,如下,仍然是不包括结束index的值:

  1. [root@localhost ~]$ jq '.company[:3]' kumufengchun.json
  2. [
  3. "baidu",
  4. "google",
  5. "alibaba"
  6. ]

也可以省略结束的index,只有开始的index,如下,输出到最后:

  1. [root@localhost ~]$ jq '.company[1:]' kumufengchun.json
  2. [
  3. "google",
  4. "alibaba"
  5. ]

开始的索引也可以是负数,表示从后边倒着数,从-1开始数:

  1. [root@localhost ~]$ jq '.company[-2:]' kumufengchun.json
  2. [
  3. "google",
  4. "alibaba"
  5. ]

5.循环输出所有的值,如数组嵌套

语法:jq '.[]'

  1. [root@localhost ~]$ jq '.[]' test.json
  2. {
  3. "name": "JSON",
  4. "good": true
  5. }
  6. {
  7. "name": "XML",
  8. "good": false
  9. }
  10. [root@localhost ~]$ jq '.[]' kumufengchun.json
  11. "kumufengchun"
  12. ""
  13. "beijing"
  14. "kumufengchun@gmail.com"
  15. "Thursday"
  16. "China"
  17. [
  18. "baidu",
  19. "google",
  20. "alibaba"
  21. ]

6.输出多个索引的值,可以用逗号分割

语法: jq '.key1,.key2'

  1. [root@localhost ~]$ jq '.name,.age' kumufengchun.json
  2. "kumufengchun"
  3. ""
  4. [root@localhost ~]$ jq '.date,.company[]' kumufengchun.json
  5. "Thursday"
  6. "baidu"
  7. "google"
  8. "alibaba"

如果是数组,用中括号括起来要输出的键值,键值先写谁,先输出谁

  1. [root@localhost ~]$ jq '.company[2,0]' kumufengchun.json
  2. "alibaba"
  3. "baidu"

7.用管道符号|可以对其进行再次处理

语法:jq .[] | .<key1>

  1. [root@localhost ~]$ jq '.[]|.name' test.json
  2. "JSON"
  3. "XML"

8.括号的作用

  1. [root@localhost ~]$ echo | jq '(.+2)*5'
  2. [root@localhost ~]$ echo {,,} | jq '(.+2)*5'

9.length求长度,如果是字符串是求的字符串的长度,如果是数组则求得是数组的长度

[root@localhost ~]$ cat kumufengchun.json | jq '.[] | length'

10.输出所有的keys

语法: jq keys

  1. [root@localhost ~]$ cat kumufengchun.json | jq 'keys'
  2. [
  3. "age",
  4. "city",
  5. "company",
  6. "country",
  7. "date",
  8. "email",
  9. "name"
  10. ]

输出数组的keys:

  1. [root@localhost ~]$ cat kumufengchun.json | jq '.company | keys'
  2. [
  3. ,
  4. ,
  5. ]

11.判断存不存在某个键

  1. [root@localhost ~]$ cat kumufengchun.json | jq 'has("email")'
  2. true
  3. [root@localhost ~]$ cat kumufengchun.json | jq 'has("address")'
  4. false

12.向josn文件中追加数据

实例1:以 /etc/docker/daemon.json 为例

原本数据如下:

  1. {
  2. "dns": [
  3. "114.114.114.114",
  4. "8.8.8.8"
  5. ],
  6. "registry-mirrors": [
  7. "http://hub-mirror.c.163.com",
  8. "https://docker.mirrors.ustc.edu.cn",
  9. "https://registry.docker-cn.com"
  10. ]
  11. }

执行追加命令

  1. cat /etc/docker/daemon.json | jq '.["log-driver"]="json-file"' > tmp.json && mv -f tmp.json /etc/docker/daemon.json
  2. cat /etc/docker/daemon.json | jq '.["log-opts"]={"max-size":"500m", "max-file":"3"}' > tmp.json && mv -f tmp.json /etc/docker/daemon.json

 最终数据如下:

  1. {
  2. "dns": [
  3. "114.114.114.114",
  4. "8.8.8.8"
  5. ],
  6. "registry-mirrors": [
  7. "http://hub-mirror.c.163.com",
  8. "https://docker.mirrors.ustc.edu.cn",
  9. "https://registry.docker-cn.com"
  10. ],
  11. "log-driver": "json-file",
  12. "log-opts": {
  13. "max-size": "500m",
  14. "max-file": "3"
  15. }
  16. }

实例2:

  1. objName="objName"
  2. objJSON='{"test": "json"}'
  3. echo '{"data":{}}' |
  4. jq --arg objectName "$objName" \
  5. --argjson jsonString "$objJSON" \
  6. '.data[$objectName] += $jsonString'

输出:

  1. {
  2. "data": {
  3. "objName": {
  4. "test": "json"
  5. }
  6. }
  7. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50233
推荐阅读
相关标签
  

闽ICP备14008679号