jq命令对JSON进行过滤遍历结构转换等操作实例

2024-03-01 0 232
目录
  • 引言
  • 基础
  • 参数[options]
  • 过滤器<jq filter>
    • 链接符
    • 对象操作
    • 数组操作
    • 数组/对象
  • 与shell结合的常见操作
    • 总结

      引言

      jq是一个灵活的轻量级命令行JSON处理器,你可以使用jq命令对JSON进行过滤、遍历或者结构转换等操作

      项目主页位于:

      https://stedolan.github.io/jq/

      你也可以在线体验:

      https://jqplay.org/

      官方文档参考:

      https://stedolan.github.io/jq/manual/#Basicfilters

      下面来让我们快速入门一下吧

      基础

      $ jq -h
      jq – commandline JSON processor [version 1.6]

      Usage: jq [options] <jq filter> [file…]
      jq [options] –args <jq filter> [strings…]
      jq [options] –jsonargs <jq filter> [JSON_TEXTS…]

      常见的用法是jq [options] <jq filter> [file…],例如

      $ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.foo\’
      {
      \”bar\”: {
      \”baz\”: 123
      }
      }

      $ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq -c \’.foo.bar\’
      {\”baz\”:123}

      其中-c为options,'.foo'即为filter,两者都会在下文介绍

      参数[options]

      🌲-r output raw strings, not JSON texts

      字符串默认带引号,使用-r可以移除字符串的引号

      $ echo \'{\”foo\”: \”bar\”}\’ | jq \’.foo\’
      \”bar\”

      $ echo \'{\”foo\”: \”bar\”}\’ | jq -r \’.foo\’
      bar

      🌲-c compact instead of pretty-printed output

      jq默认输出格式化之后的json,如果希望能在一行输出使用-c

      $ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.foo | .bar\’
      {
      \”baz\”: 123
      }

      $ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq -c \’.foo | .bar\’
      {\”baz\”:123}

      过滤器<jq filter>

      🌲. 输出原始的 JSON 数据

      因为jq默认是格式化的,所以这个filter可以当作格式化

      $ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.\’
      {
      \”foo\”: {
      \”bar\”: {
      \”baz\”: 123
      }
      }
      }

      链接符

      先看下连接符,具体filter的含义下面会介绍。两个连接符都是用来组合不同filter来完成特定功能的

      🌲, 使用多个 filter

      需要注意的是使用,每一个filter产生的输出都是一行

      $ echo \'{\”user\”:\”stedolan\”, \”projects\”: [\”jq\”, \”wikiflow\”]}\’ | jq \’.user, .projects[]\’
      \”stedolan\”
      \”jq\”
      \”wikiflow\”

      🌲| 管道

      jq '.a.b.c'、jq '.a | .b | .c'jq '.a' | jq '.b' | jq '.c'是一样的

      如果第一个filter产生多个结果,那么下一个filter会对每一个结果都执行。因此.[] | .foo取出数组中的每一个"foo"

      $ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[] | .name\’
      \”JSON\”
      \”XML\”

      对象操作

      🌲.foo,.foo.bar 获取对象key的值

      '.foo'代表获取foo这个key

      '.foo.bar'代表获取foo对象中的bar,它和上文介绍的.foo|.bar相同

      $ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.foo\’
      {
      \”bar\”: {
      \”baz\”: 123
      }
      }

      $ echo \'{ \”foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.foo.bar\’
      {
      \”baz\”: 123
      }

      ⚠️ 如果对象的key包含特殊字符或者以数字开头,使用'.foo'会报错。此时需要使用双引号包裹:."foo$"、."1foo"

      $ echo \'{ \”1foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.1foo\’
      jq: error: syntax error, unexpected IDENT, expecting $end (Unix shell quoting issues?) at &lt;top-level&gt;, line 1:
      .1foo
      jq: 1 compile error

      $ echo \'{ \”1foo\”: { \”bar\”: { \”baz\”: 123 } } }\’ | jq \’.\”1foo\”\’
      {
      \”bar\”: {
      \”baz\”: 123
      }
      }

      ❗️当取值不是对象时jq默认会报错,如果想忽略报错可以使用 .foo?

      $ echo \'[1,2,3]\’ | jq \’.foo\’
      jq: error (at &lt;stdin&gt;:1): Cannot index array with string \”foo\”

      $ echo \'[1,2,3]\’ | jq \’.foo?\’

      数组操作

      🌲.[2] 数组索引

      数组索引也是从0开始,同时支持负数

      $ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[0]\’
      {
      \”name\”: \”JSON\”,
      \”good\”: true
      }

      $ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[-2]\’
      {
      \”name\”: \”JSON\”,
      \”good\”: true
      }

      🌲.[10:15] 数组切片

      .[10:15]包含从从0开始10(含)到15(不含)号元素,如果没有值则默认到头/尾

      $ echo \'[\”a\”,\”b\”,\”c\”,\”d\”,\”e\”]\’ | jq \’.[1:3]\’
      [
      \”b\”,
      \”c\”
      ]

      $ echo \'[\”a\”,\”b\”,\”c\”,\”d\”,\”e\”]\’ | jq \’.[1:]\’
      [
      \”b\”,
      \”c\”,
      \”d\”,
      \”e\”
      ]

      数组/对象

      🌲.[] 遍历

      对于数组来说,会返回数组中的所有元素

      $ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[]\’
      {
      \”name\”: \”JSON\”,
      \”good\”: true
      }
      {
      \”name\”: \”XML\”,
      \”good\”: false
      }

      对于对象来说,会返回对象中的所有值

      $ echo \'{\”a\”:1,\”b\”:[1,2]}\’ | jq \’.[]\’
      1
      [
      1,
      2
      ]

      结合上文提到管道,可以取出数组中的每一个field

      $ echo \'[{\”name\”:\”JSON\”, \”good\”:true}, {\”name\”:\”XML\”, \”good\”:false}]\’ | jq \’.[] | .name\’
      \”JSON\”
      \”XML\”

      与shell结合的常见操作

      🌲同时将json中的多个值赋值到多个变量

      首先利用,来同时解析多个json字段

      其次用echo把多行输出转换成单行输出

      最后利用read读取到多个变量里

      $ read json xml &lt;&lt;&lt; $(echo $(echo \'{\”foo\”:\”JSON\”,\”bar\”:\”XML\”}\’ | jq -c \’.foo, .bar\’)) &amp;&amp; \\
      echo \”json:$json,xml:$xml\”
      json:\”JSON\”,xml:\”XML\”

      🌲把多个json字段输出到一行

      上面使用echo是一种方式,还有一种更通用,尤其是处理数组时更方便的方式

      利用@tsv处理,注意输入需要是数组

      # 不加处理
      $ echo \'[{\”name\”:\”JSON\”,\”good\”:true},{\”name\”:\”XML\”,\”good\”:false}]\’ | jq -r \’.[] | .name, .good\’
      JSON
      true
      XML
      false

      # 利用@tsv处理,注意输入需要是数组
      $ echo \'[{\”name\”:\”JSON\”,\”good\”:true},{\”name\”:\”XML\”,\”good\”:false}]\’ | jq -r \’.[] | [.name, .good] | @tsv\’
      JSON true
      XML false

      # 还可以输出csv格式的
      $ echo \'[{\”name\”:\”JSON\”,\”good\”:true},{\”name\”:\”XML\”,\”good\”:false}]\’ | jq -r \’.[] | [.name, .good] | @csv\’
      \”JSON\”,true
      \”XML\”,false

      🌲遍历数组

      对数组中的每一个元素进行处理

      $ echo \'[\”a\”,\”b\”,\”c\”,\”d\”,\”e f\”]\’ | jq -c \’.[]\’ | while read i; do echo \”val=${i}\”; done
      val=\”a\”
      val=\”b\”
      val=\”c\”
      val=\”d\”
      val=\”e f\”

      总结

      以上主要介绍了用jq提取jso,更多关于jq命令操作JSON的资料请关注悠久资源网其它相关文章!

      您可能感兴趣的文章:

      • linux命令下jq的用法及说明
      • Linux中shell脚本的jq命令用法详解
      • 处理JSON最强命令jq使用场景
      • 超级好用的轻量级JSON处理命令jq(最新推荐)

      收藏 (0) 打赏

      感谢您的支持,我会继续努力的!

      打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
      点赞 (0)

      悠久资源 linux shell jq命令对JSON进行过滤遍历结构转换等操作实例 https://www.u-9.cn/jiaoben/linuxshell/179633.html

      常见问题

      相关文章

      发表评论
      暂无评论
      官方客服团队

      为您解决烦忧 - 24小时在线 专业服务