linux json 数据处理工具 jq 实践

最近经常在linux写一些shell脚本,并且时常会碰到JSON数据处理,因此接触了jq这个软件,简单记录一下使用心得。

如何安装

安装方式,会因为系统不同而有所不同,在公司使用的redhat8, 而自己的云服务器,则是unbuntu.

Redhat

yum install jq

Ubuntu

apt install jq

安装成功用,可以在终端执行jq命令,会得到如下信息

ubuntu@VM-4-3-ubuntu:~$ jq
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 is a tool for processing JSON inputs, applying the given filter to
its JSON text inputs and producing the filter's results as JSON on
standard output.

The simplest filter is ., which copies jq's input to its output
unmodified (except for formatting, but note that IEEE754 is used
for number representation internally, with all that that implies).

For more advanced filters see the jq(1) manpage ("man jq")
and/or https://stedolan.github.io/jq

Example:

        $ echo '{"foo": 0}' | jq .
        {
                "foo": 0
        }

For a listing of options, use jq --help.

简单使用

格式化JSON

ubuntu@VM-4-3-ubuntu:~$ echo '{"host" : {"name": "test","data-center": "cn"}}' | jq '.'
{
  "host": {
    "name": "test",
    "data-center": "cn"
  }
}
ubuntu@VM-4-3-ubuntu:~$

读取JSON字段

ubuntu@VM-4-3-ubuntu:~$ echo '{"host" : {"name": "test","data-center": "cn"}}' | jq '.host'
{
  "name": "test",
  "data-center": "cn"
}
ubuntu@VM-4-3-ubuntu:~$

ubuntu@VM-4-3-ubuntu:~$ echo '{"host" : {"name": "test","data-center": "cn"}}' | jq '.host.name'
"test"
ubuntu@VM-4-3-ubuntu:~$


ubuntu@VM-4-3-ubuntu:~$ echo '{"host" : {"name": "test","data-center": "cn"}}' | jq '.host."data-center"'
"cn"
ubuntu@VM-4-3-ubuntu:~$

字符串的特性

如此段代码,最后得的结果为**“test”, 而不是如果别的语言那般,得到的时test**,一定要注意,不然在后续使用过程中,可能会得不到期望的结果。

ubuntu@VM-4-3-ubuntu:~$ echo '{"host" : {"name": "test","data-center": "cn"}}' | jq '.host.name'
"test"
ubuntu@VM-4-3-ubuntu:~$

如果去掉字符串的引号,可以添加参数 -r

ubuntu@VM-4-3-ubuntu:~$ echo '{"host" : {"name": "test","data-center": "cn"}}' | jq -r '.host."data-center"'
cn
ubuntu@VM-4-3-ubuntu:~$

使用变量读取字段

ubuntu@VM-4-3-ubuntu:~$ name=name;echo '{"host" : {"name": "test","data-center": "cn"}}' | jq ".host.${name}"
"test"
ubuntu@VM-4-3-ubuntu:~$

注意,因为JSON的key为字符串,并且字符串里面可以包含特殊字符,如 -, _,此时可能需要特殊处理。
如以上例子,当我们要获取data-center的数据时,如果直接替换,则会失败

ubuntu@VM-4-3-ubuntu:~$  name="data-center";echo '{"host" : {"name": "test","data-center": "cn"}}' | jq ".host.${name}"
jq: error: center/0 is not defined at <top-level>, line 1:
.host.data-center
jq: 1 compile error
ubuntu@VM-4-3-ubuntu:~$  name=data-center;echo '{"host" : {"name": "test","data-center": "cn"}}' | jq ".host.${name}"
jq: error: center/0 is not defined at <top-level>, line 1:
.host.data-center
jq: 1 compile error
ubuntu@VM-4-3-ubuntu:~$

如果我们把jq后的双引号,替换为单引号呢?

ubuntu@VM-4-3-ubuntu:~$ name="data-center";echo '{"host" : {"name": "test","data-center": "cn"}}' | jq '.host.${name}'
jq: error: syntax error, unexpected '$', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.host.${name}
jq: 1 compile error
ubuntu@VM-4-3-ubuntu:~$

结果时依旧报错。为何呢?
这里涉及到一个bash脚本的一个特性,当使用模板语句时,变量仅在双引号内起作用,如国在单引号里面,会被当成字符串处理。

ubuntu@VM-4-3-ubuntu:~$ name="data-center"| echo "name=${name}"
name=data-center
ubuntu@VM-4-3-ubuntu:~$ name="data-center"| echo 'name=${name}'
name=${name}
ubuntu@VM-4-3-ubuntu:~$

因此,回到开始的问题,使用以下命令即可。

ubuntu@VM-4-3-ubuntu:~$ name="data-center";echo '{"host" : {"name": "test","data-center": "cn"}}' | jq '.host' | jq ".[\"${name}\"]"
+ name=data-center
+ jq .host
+ jq '.["data-center"]'
+ echo '{"host" : {"name": "test","data-center": "cn"}}'
"cn"
++ history -a
++ history -a
++ history -a
ubuntu@VM-4-3-ubuntu:~$

总结

jq是一个非常强大的工具,对于在shell脚本里面处理JSON格式数据,有很大的帮助。
此处仅记录以下本人使用的一些场景,更多的使用技巧,可以参考以下网页。
https://www.baeldung.com/linux/jq-command-json

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值