linux中json处理工具jq的安装和使用
最近在使用shell写自动化脚本的时候涉及到对json文件的配置和读取,为了方便处理,于是封装了一个方法,通过使用jq工具来对json数据进行处理。

一、jq的简介

jq是一款命令行下处理JSON数据的工具。它可以接受标准输入,命令管道或者文件中的JSON数据,通过一系列的过滤器和表达式的转换后生成我们需要的数据结构并格式化输出,这样就方便我们在一大堆数据中方便的获取到我们想要的数据,轻量便捷。

二、jq的安装

jq可以通过系统自带的软件包管理器直接安装,也可以手动从源代码编译安装。jq的源代码可以直接从git仓库获得,git仓库地址是:https://github.com/stedolan/jq.git。具体的安装命令如下:
在mac中可以直接通过brew install jq就可以了,不过需要先安装了homebrew。
在linux和osx系统中:

git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure –disable-maint ainer-mode
make
sudo make install

不过我在windows系统下尝试过是无法这样安装的。

三、jq的使用

jq支持使用-h或者–help查看jq的详细使用方法。需要注意的是jq的输入内容必须严格遵守JSON格式的标准,即所有的属性必须是以双引号包括的字符串;对象的最后一个属性的末尾或者数组的最后一个元素的末尾不能有逗号,否则jq会抛出无法解析JSON的错误。
jq通过命令行来控制对输入输出的处理。介绍几个常用的命令行选项。
+ -r选项。该选项是输出raw格式内容或JSON格式内容,即符合JSON标准格式。如我们要查询一个JSON字符串{“name”:”bob”}中name的值,使用-r选项的时候返回的只有值,不会加上双引号。
+ -s选项。jq可以同时处理空格分割的多个JSON字符串输入。使用-s选项,jq会将所有的JSON输入放入一个数组中并在这个数组上使用filter。
+ –arg选项。jq通过该选项提供了和宿主脚本语言交互的能力。比如将一个值绑定到一个变量上,在后面的filter中可以直接通过变量引用到这个值。

四、基础表达式

‘.’符号:表示默认输出。对作为表达式输入的整个JSON对象的引用。
JSON对象操作。jq提供了两种基本表达式用来访问JSON对象的属性:‘.< attributename >’和’.< attributename >?’。正常情况下,这两个表达式的行为相同,都是访问对象的属性,如果JSON对象不包含指定的属性则返回null。区别就是当输入的不是JSON对象或者数组时,第一个表达式会抛出异常。而第二个表达式则无任何输出。
数组操作。jq提供了三种基础表达式来操作数组“
+ 迭代操作:(‘.[]’)。该表达式的输入可以是数组或者JSON对象。输出的是基于数组元素或者JSON对象属性值的iterator。
+ 访问特定元素的操作(‘.[index]’或’.[attributename]’)。用来访问数组元素或者JSON对象的属性值。输出的是单个值。
+ 数组切片操作(‘.[startindex:endindex]’)

表达式操作(’,’和’|’).表达式操作是用来关联多个基础表达式。逗号表示对同一个输入应用多个表达式。管道符表示将前一个表达式的输出用作后一个表达式的输入。当前一个表达式产生的结果是迭代器时,会将迭代器的每一个值用作后一个表达式的输入从而形成新的表达式。

五、常用功能

假设我们有如下demo.json数据

    {
    "name": "school",
    "students": [
    {
    "name": "xiaoming",
    "age": "18",
    },
    {
    "name": "helen",
    "age": "19",
    }
    ],
    "address": {
    "country": "China",
    "city": "beijing"
    }
    }

+ 格式化

假设我们要对请求某个接口返回的json数据进行格式化,则只需写curl “https://www.baidu.com” -s | jq ‘.’

  • 获取特定字段

根据json数据中的key获取value,直接添加jq ‘.key’即可。例如:
echo ‘{“name”:”bob”,”age”:”20”}’ | jq ‘.name’
school
注意:当我们解析不存在的key时,会返回null
echo ‘{“name”:”bob”,”age”:”20”}’ | jq ‘.sex’
null

  • 同时可以进行嵌套解析

    cat demo.json | jq ‘.address.city’
    “beijing”

  • 对数组操作

    • 获取数组中的某一项
      cat demo.json | jq ‘.students[1].name’
      helen
  • 内建函数

    jq还有一些内建函数,如key,has
    key是用来获取json中的key元素的,如:
    cat demo.json | jq ‘keys’
    [
    “name”,
    “students”,
    “address”
    ]
    has是用来判断是否存在某个key
    cat demo.json | jq ‘has(“name”)’
    true
    cat demo.json | jq ‘has(“sex”)’
    false

  • map函数

    输入:[1,2,3,4]
    jq表达式:jq -r ‘map(.+1)’
    输出:[2,3,4,5]

Logo

更多推荐