Linux中在命令行中使用JQ来解析修改JSON字符串

Linux中在命令行中使用JQ来解析修改JSON字符串

在现实开发场景中, 经常需要在命令行中做一些解析json数据的工作,在linux中并没有提供太多有用了工具来帮你完成这样的工作,在经过寻找以后发现一个叫做jq的工具,可以帮你在命令行中做相关的解析工作。

要使用请先安装

sudo apt-get install jq -y

  1. 查找所需要的属性(查询)

通过命令行,我们首先使用jd来从json字符串中解析我们所需要的属性。

首先我们先新建一个json文件,打开命令行输入:

gedit info.json

这个命令会新建一个info.json的文件,并通过Ubuntu自带的编辑器打开,

复制下面的json到文件中,保存

{
        "name": "Orange",
        "location":
                {
                        "city": "China"
                },
        "Company":
                 {
                         "name": "Siemens",
                          "division": "Developer"
                  }
}

然后在命令行中输入下面命令:

  • cat cat test.json | jq '.name' | jq '.name'
    "Orange"

  • cat info.json | jq '.location.city'
    "China"
    如果有多个属性需要查询,例如Company下面有name以及division属性,我们可以用一下命令

  • cat info.json |jq '.Company|{name,division}'
    { "name": "Siemens", "division": "Developer" }

是不是很简单,这样你想要查询任何一个json的数据只要按照这个写法就好了

  1. 修改json字符串的值(修改)

楼主现在公司做AWS CloudFormation有关的东西,AWS CloudFormation的配置是需要读取各种Json的配置文件的,通过是讲Json堆栈的配置文件转换成为一整套的AWS资源。所以我经常需要更新我的Json配置。但是AWS基本都是在linux上远程操作,然后通过脚本来进行自动测试,所以修改Json的配置文件是不可缺少的一项技能。

本文借此在这里来谈谈如何使用jq来修改Json文件

修改object类型的json

{
  "honesty": "Apple Jack",
  "laughter": "Pinkie Pie",
  "loyalty": "Rainbow Dash"
}

把之前的info.json文件打开,删掉原来的内容,讲上面的json复制进去,

我们可以看到,honesty的值当前为“Apple Jack”,现在如果我想讲“Apple Jack”更改为其他的值Orange:

cat info.json | 
  jq 'to_entries | 
       map(if .key == "honesty" 
          then . + {"value":"Orange"} 
          else . 
          end
         ) | 
      from_entries'

输出:

{
  "honesty": "Orange",
  "laughter": "Pinkie Pie",
  "loyalty": "Rainbow Dash"
}

通常情况下,我们只需要更改键的值就可以了。但是有的时候我需要连键一起更改的话,我们需要这么做:

cat info.json | 
  jq 'to_entries | 
       map(if .key == "honesty" 
          then . + {"key":"Orange"} 
          else . 
          end
         ) | 
      from_entries'

输出

{
  "Orange": "Apple Jack",
  "laughter": "Pinkie Pie",
  "loyalty": "Rainbow Dash"
}

如果想将修改后的字符串输入到文件中,只需要在命令后面追加
> new.json

覆盖掉原来的文件的内容,如果存在的话

>> new.json

在原来文件的后面追加新的内容,不会覆盖原来文件的内容

  • 我们知道在上述命令中使用了cat info.json | jq to_entries,通过这个命令,我们就能查看json的具体结构,map函数也是根据这个json的结构帮我们做了遍历操作
    [
      {
        "key": "honesty",
        "value": "Apple Jack"
      },
      {
        "key": "laughter",
        "value": "Pinkie Pie"
      },
      {
        "key": "loyalty",
        "value": "Rainbow Dash"
      }
    ]

这样的话,上面的命令是不是更加好理解了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 基础 1. 学习基础的bash用法,具体地说,阅读bash的man手册(man bash 并通读一遍);很简...
    Leon_Geo阅读 1,147评论 1 19
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,243评论 2 33
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,977评论 6 342
  • 命令行的艺术 前言 基础 日常使用 文件及数据处理 系统调试 单行脚本 冷门但有用 仅限 OS X 系统 仅限 W...
    进击的诺基亚阅读 3,870评论 0 19