绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
linux jq命令的一次有趣实践
2021-05-12 16:13:19
运维就要无所不能,无所不会


大家好,我是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,对responsejson转换,如果是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}, {}]
           => [truefalse]

           jq ´map(has(2))´
              [[,1], ["a","b","c"]]
           => [falsetrue]
  • 选择比较
           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]]]
           => [123]

           jq ´flatten(1
              [1, [2], [[3]]]
           => [12, [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




分享好友

分享这个小栈给你的朋友们,一起进步吧。

Linux技术精选专区
创建时间:2020-07-08 10:30:23
Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年第一次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • dapan
    专家
猜你喜欢
戳我,来吐槽~