ITPub博客

首页 > 应用开发 > > linux jq命令的一次有趣实践

linux jq命令的一次有趣实践

作者:dapan 时间:2021-05-12 16:13:19 0 删除 编辑
运维就要无所不能,无所不会


大家好,我是Stanley「史丹利」,今天聊一些简单的技术实践: linux jq命令的一次有趣实践。文章目录如下:


  • 一、背景

  • 二、jq 命令用法

    • 2.1 "."

    • 2.2、[index]

    • 2.3、管道线|

    • 2.4、[]

    • 2.5、其它有用功能

  • 三、CentOS 7安装jq


linux jq命令的一次有趣实践

一、背景

我们的CMDB平台没有导出功能,但我想把某业务模块的ip列表拿出来。小100个ip地址,一个个去写太累了。

debug

所以我打开debug,对response做json转换,如果是json或者yaml格式,想过滤对应的列表就容易多了。比较幸运,前后台数据传输是标准的JSON格式。

json-type

使用了强大的jq命令二次处理数据。

# cat iplist.json | jq '[.][0] | {ip: .object.host_detail[].ip,env: .object.host_detail[].env}'
...
{
  "ip": "1.1.1.1",
  "env": "PROD"
}
{
  "ip": "1.1.1.1",
  "env": "PROD"
}
...


二、jq 命令用法

  • 案例
# cat test.json
[{"name":"运维部落工具","url":"http://tool.osforce.cn.com","address":{"city":"厦门","country":"中国"},"arrayBrowser":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]},{"name":"运维部落之家","url":"http://tool.zzhome.com","address":{"city":"大连","country":"中国"},"arrayBrowser":[{"name":"360","url":"http://www.so.com"},{"name":"bing","url":"http://www.bing.com"}]}]

2.1 "."

最简单的jq程序是表达式".",它不改变输入,但可以将其优美地输出,便于阅读和理解。

image-20210511202141122

2.2、[index]

输出列表中的第一个元素,可以使用[index]:

# cat test.json | jq '.[0]'
{
  "name": "运维部落工具",
  "url": "http://tool.osforce.cn.com",
  "address": {
    "city": "厦门",
    "country": "中国"
  },
  "arrayBrowser": [
    {
      "name": "Google",
      "url": "http://www.google.com"
    },
    {
      "name": "Baidu",
      "url": "http://www.baidu.com"
    }
  ]
}

2.3、管道线|

jq支持管道线|,它如同linux命令中的管道线——把前面命令的输出当作是后面命令的输入。如下命令把.[0]作为{...}的输入,进而访问嵌套的属性,如.name和.address.city。

观察如下几个命令,通过改变|前后的输入和输出来达到不同的效果:

# cat test.json | jq '.[0] | {name:.name,city:.address.city}'
{
  "name": "运维部落工具",
  "city": "厦门"
}
# cat test.json | jq ".[] | {name:.arrayBrowser[1].name,city:.address.city}"
{
  "name": "Baidu",
  "city": "厦门"
}
{
  "name": "bing",
  "city": "大连"
}

2.4、[]

如果希望把jq的输出当作一个数组,可以在前后加上[]:

cat test.json | jq "[.[] | {name:.arrayBrowser[1].name,city:.address.city}]"
[
  {
    "name": "Baidu",
    "city": "厦门"
  },
  {
    "name": "bing",
    "city": "大连"
  }
]
  • 文首命令解释如下
# cat iplist.json | jq '[.][0] | {ip: .object.host_detail[].ip,env: .object.host_detail[].env}'

# [.] 将管道的输出转换为数组
# [.][] 取数组的第一个元素
# [.][] | {xxx}  将第一个元素的数据通过管道交给 {} 二次处理
# {ip: .object.host_detail[].ip,env: .object.host_detail[].env}  取.object.host_detail[].ip并设置key为ip,取env: .object.host_detail[].env并设置key为env

2.5、其它有用功能

  • 分割切片功能
# 规则      jq ´.[-2]´
# 原字符串          [1,2,3]
# 结果       => 2


# 规则       jq ´.[:3]´
# 原字符串          ["a","b","c","d","e"]
# 结果       => ["a", "b", "c"]

# 规则       jq ´.[-2:]´
# 原字符串          ["a","b","c","d","e"]
# 结果       => ["d", "e"]
  • 取指定字符串
           jq ´.foo, .bar´
              {"foo": 42, "bar": "something else", "baz": true}
           => 42, "something else"

           jq ´.user, .projects[]´
              {"user":"stedolan", "projects": ["jq", "wikiflow"]}
           => "stedolan", "jq", "wikiflow"

           jq ´.[4,2]´
              ["a","b","c","d","e"]
           => "e", "c"
  • 简单的运算
           jq ´[ .[] | . * 2]´
              [1, 2, 3]
           => [2, 4, 6]
image-20210511205523771
  • haskey
           jq ´map(has("foo"))´
              [{"foo": 42}, {}]
           => [true, false]

           jq ´map(has(2))´
              [[,1], ["a","b","c"]]
           => [false, true]
  • 选择比较
           jq ´map(select(. >= 2))´
              [1,5,3,,7]
           => [5,3,7]
  • 匹配 key = value 选择
           jq ´.[] | select(.id == "second")´
              [{"id": "first", "val": 1}, {"id": "second", "val": 2}]
           => {"id": "second", "val": 2}
  • 给key名增加关键字
           jq ´with_entries(.key |= "KEY_" + .)´
              {"a": 1, "b": 2}
           => {"KEY_a": 1, "KEY_b": 2}
  • 扁平化数组
           jq ´flatten´
              [1, [2], [[3]]]
           => [1, 2, 3]

           jq ´flatten(1)´
              [1, [2], [[3]]]
           => [1, 2, [3]]

           jq ´flatten´
              [[]]
           => []

  • 其它一些骚操作
           jq ´10 / . * 3´
              5
           => 6
image-20210511205805070

其它诸如排序(sort)、取整(float)、开根(sqrt)、去重(unique)、inside、startswith、spilt、join等太多功能了,光用法就能写一本书出来了。。。大家自行摸索吧。

三、CentOS 7安装jq

  • 系统环境
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
  • 安装
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum repolist
yum install jq



原文链接:https://mp.weixin.qq.com/s/gesShq03zwHyAx0OxPu_yw




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/758/viewspace-3118417/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87052