经典用法

jq是在命令行中格式化、抽取子json一种强大的工具,如果想在terminal中玩转json,请第一时间想到jq,不是jquery。先看下面的gif,这是jq最经典的用法,将原始格式的json,格式化显示在界面上。有才的jq作者

jq-common-use.gif

简单介绍

jq命令行help帮助,安装之后jq -h 先简单了解一下。jq获取json数据的方式:

  1. 通过管道获取json数据,cat file.json | jq .
  2. 直接从文件中获取 jq . file.json

从下图的帮助文档中可以看到:jq工具的流程是:json输入 =》 对json应用filters =》将将结果以json的形式输出到标准输出
jq-help.png

jq 基础filter

  1. 点号(.), 代表整个json文档;'.<attributename>'和'.<attributename>?'选取对应的属性。区别是问号代表optional。即是否抛出异常。
  2. 数组操作。jq 提供三种基础表达式来操作数组:

    1. 迭代器操作('.[]'). 该表达式的输入可以是数组或者 JSON 对象。输出的是基于数组元素或者 JSON 对象属性值的 iterator。
    2. 访问特定元素的操作('.[index]'或'.[attributename]')。用来访问数组元素或者 JSON 对象的属性值。输出是单个值
    3. 数组切片操作('.[startindex:endindex]'),其行为类似于 python 语言中数组切片操作。
  3. 表达式操作(','和 '|')。表达式操作是用来关联多个基础表达式。其中逗号表示对同一个输入应用多个表达式。管道符表示将前一个表达式的输出用作后一个表达式的输入。当前一个表达式产生的结果是迭代器时,会将迭代器中的每一个值用作后一个表达式的输入从而形成新的表达式。例如'.[]|.+1', 在这个表达式中,第一个子表达式'.[]'在输入数组上构建迭代器,第二个子表达式则在迭代器的每个元素上加 1。

例子

  1. 调整输出
  echo '{
      "protocol": "TCP",
      "port": 443,
      "targetPort": 443,
      "nodePort": 0
    }' | jq ".port | {DSTPORT:.}"

结果:

    {
       "DSTPORT": 443
    }

2.if判断
如果protocol字段等于tcp就打印出json,如果不等于打印not tcp

echo '{"protocol":"TCP","port":443,"targetPort":443,"nodePort":0}' | jq 'if .protocol == "TCP" then . else "not tcp" end'

https://www.ibm.com/developerworks/cn/linux/1612_chengg_jq/index.html
https://www.zhihu.com/question/20057446
http://justcode.ikeepstudying.com/2018/02/shell%EF%BC%9A%E6%97%A0%E6%AF%94%E5%BC%BA%E5%A4%A7%E7%9A%84shell%E4%B9%8Bjson%E8%A7%A3%E6%9E%90%E5%B7%A5%E5%85%B7jq-linux%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%A7%A3%E6%9E%90json-jq%E8%A7%A3%E6%9E%90-json/

文章目录