安装Homebrew:

 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

安装yum:

brew install yum

安装jq:

yum -y install jq

例子:


response1="{"user_system_default_download_domain":"d.maps9.com","id":"60e3f11c23389f0c62175baf","type":"ios","short":"mlvq","download_domain":"d.maps9.com","download_domain_https_ready":true,"app_user_id":"60e3cd1323389f33fd60cbcf","storage":"qiniu","form_method":"POST","cert":{"icon":{"key":"7e64106f6076751e14ef17e9dd74e40a812c4364","token":"_Vr9k9CbrqN6dKAd18Ezner7W9yR86vNze9XcT9h:26-Gu2Boy_o_tJsY2eM5CYVgybo=:eyJzY29wZSI6ImZpcmljb246N2U2NDEwNmY2MDc2NzUxZTE0ZWYxN2U5ZGQ3NGU0MGE4MTJjNDM2NCIsImNhbGxiYWNrVXJsIjoiaHR0cDovL2Zpci1hcGkuZmlyY2xpLmNuL2F1dGgvcWluaXUvY2FsbGJhY2s_cGFyZW50X2lkPTYwZTNmMTFjMjMzODlmMGM2MjE3NWJhZlx1MDAyNnRpbWVzdGFtcD0xNjY3MjczMDM0XHUwMDI2c2lnbj1jZmQyN1x1MDAyNm9yaWdpbmFsX2tleT01YWIwNjkxMjFmZjdkMDY0OGZjNjI2NzI3Y2ZkNDIxZTg0YzVjNzMyIiwiY2FsbGJhY2tCb2R5Ijoia2V5PSQoa2V5KVx1MDAyNmV0YWc9JChldGFnKVx1MDAyNmZzaXplPSQoZnNpemUpXHUwMDI2Zm5hbWU9JChmbmFtZSlcdTAwMjZvcmlnaW49JCh4Om9yaWdpbilcdTAwMjZpc19jb252ZXJ0ZWQ9JCh4OmlzX2NvbnZlcnRlZCkiLCJkZWFkbGluZSI6MTY2NzI3MzYzNCwidXBob3N0cyI6WyJodHRwOi8vdXAucWluaXUuY29tIiwiaHR0cDovL3VwbG9hZC5xaW5pdS5jb20iLCItSCB1cC5xaW5pdS5jb20gaHR0cDovLzE4My4xMzEuNy4zIl0sImdsb2JhbCI6ZmFsc2V9","upload_url":"https://upload.qbox.me","custom_headers":{},"custom_callback_data":{"original_key":"5ab069121ff7d0648fc626727cfd421e84c5c732"}},"binary":{"key":"bfe080bbf69a52d5a5da146ce17f3eda985194d6","token":"_Vr9k9CbrqN6dKAd18Ezner7W9yR86vNze9XcT9h:Bu1mVHfZk9j7FyJYUkU73hi2JLc=:eyJzY29wZSI6InByby1hcHA6YmZlMDgwYmJmNjlhNTJkNWE1ZGExNDZjZTE3ZjNlZGE5ODUxOTRkNiIsImNhbGxiYWNrVXJsIjoiaHR0cDovL2Zpci1hcGkuZmlyY2xpLmNuL2F1dGgvcWluaXUvY2FsbGJhY2s_cGFyZW50X2lkPTYwZTNmMTFjMjMzODlmMGM2MjE3NWJhZlx1MDAyNnRpbWVzdGFtcD0xNjY3MjczMDM0XHUwMDI2c2lnbj1jZmQyN1x1MDAyNnVzZXJfaWQ9NjBlM2NkMTMyMzM4OWYzM2ZkNjBjYmNmIiwiY2FsbGJhY2tCb2R5Ijoia2V5PSQoa2V5KVx1MDAyNmV0YWc9JChldGFnKVx1MDAyNmZzaXplPSQoZnNpemUpXHUwMDI2Zm5hbWU9JChmbmFtZSlcdTAwMjZvcmlnaW49JCh4Om9yaWdpbilcdTAwMjZuYW1lPSQoeDpuYW1lKVx1MDAyNmJ1aWxkPSQoeDpidWlsZClcdTAwMjZ2ZXJzaW9uPSQoeDp2ZXJzaW9uKVx1MDAyNmlzX3VzZV9tcWM9JCh4OmlzX3VzZV9tcWMpXHUwMDI2Y2hhbmdlbG9nPSQoeDpjaGFuZ2Vsb2cpXHUwMDI2cmVsZWFzZV90eXBlPSQoeDpyZWxlYXNlX3R5cGUpXHUwMDI2ZGlzdHJpYnV0aW9uX25hbWU9JCh4OmRpc3RyaWJ1dGlvbl9uYW1lKVx1MDAyNnN1cHBvcnRlZF9wbGF0Zm9ybT0kKHg6c3VwcG9ydGVkX3BsYXRmb3JtKVx1MDAyNm1pbmltdW1fb3NfdmVyc2lvbj0kKHg6bWluaW11bV9vc192ZXJzaW9uKVx1MDAyNnVpX3JlcXVpcmVkX2RldmljZV9jYXBhYmlsaXRpZXM9JCh4OnVpX3JlcXVpcmVkX2RldmljZV9jYXBhYmlsaXRpZXMpXHUwMDI2dWlfZGV2aWNlX2ZhbWlseT0kKHg6dWlfZGV2aWNlX2ZhbWlseSkiLCJkZWFkbGluZSI6MTY2NzI3NjYzNCwidXBob3N0cyI6WyJodHRwOi8vdXAucWluaXUuY29tIiwiaHR0cDovL3VwbG9hZC5xaW5pdS5jb20iLCItSCB1cC5xaW5pdS5jb20gaHR0cDovLzE4My4xMzEuNy4zIl0sImdsb2JhbCI6ZmFsc2V9","upload_url":"https://upload.qbox.me","custom_headers":{}},"mqc":{"total":5,"used":0,"is_mqc_availabled":true},"support":"qiniu","prefix":"x:"}}"response=$(curl -X "POST" "http://api.bq04.com/apps" \-H "Content-Type: application/json" \-d "{\"type\":\"ios\", \"bundle_id\":\"com.china.NewFXeye\", \"api_token\":\"9392a78ca4489b3be9b60b5eac8dxxxx\"}")upload_url=$(echo $response1 | jq -r .cert.binary.upload_url)
echo "打印解析的upload_url:$upload_url"

注:jq后要加-r,不然后面要使用该变量会自动加上引号

  -c               compact instead of pretty-printed output;-n               use `null` as the single input value;-e               set the exit status code based on the output;-s               read (slurp) all inputs into an array; apply filter to it;-r               output raw strings, not JSON texts;-R               read raw strings, not JSON texts;-C               colorize JSON;-M               monochrome (don't colorize JSON);-S               sort keys of objects on output;--tab            use tabs for indentation;--arg a v        set variable $a to value <v>;--argjson a v    set variable $a to JSON value <v>;--slurpfile a f  set variable $a to an array of JSON texts read from <f>;--rawfile a f    set variable $a to a string consisting of the contents of <f>;--args           remaining arguments are string arguments, not files;--jsonargs       remaining arguments are JSON arguments, not files;--               terminates argument processing;

======================================================================

以下内容为转载:

shell jq处理json字符串

1.1 工具介绍

自己用shell处理json字符串的时候,开发输入格式的不通会导致解析字符串有问题,所以这里用到了jq工具
jq 是一款命令行下处理 JSON 数据的工具。其可以接受标准输入,命令管道或者文件中的 JSON 数据,经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将结果输出到标准输出中。jq 的这种特性使我们可以很容易地在 Shell 脚本中调用它。

2.1 安装jq

  • macos
brew install jq
  • linux
wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
chmod a+x jq-linux64 && mv jq-linux64 /usr/bin/jq
  • centos
yum install epel-release
yum install jq
  • ubuntu
apt update
apt install -y jq

3.1 jq表达式

3.1.1 选项

  • '-r'选项。
    该选项控制 jq 是输出 raw 格式内容或 JSON 格式内容。所谓的 JSON 格式是指符合 JSON 标准的格式。例如,假设我们要查询 JSON 字符串{"name":"tom"}中 name 的值. 使用-r 选项时返回的是'tom'. 不使用-r 选项时,返回的是'"tom"'.返回值多了一对双引号。
  • -s 选项。
    jq 可以同时处理空格分割的多个 JSON 字符串输入。默认情况下,jq 会将 filter 分别对每个 JSON 输入应用,并返回结果。使用-s 选项,jq 会将所有的 JSON 输入放入一个数组中并在这个数组上使用 filter。"-s"选项不但影响到 filter 的写法。如果在 filter 中需要对数据进行选择和映射,其还会影响最终结果。
  • --arg 选项。
    jq 通过该选项提供了和宿主脚本语言交互的能力。该选项将值(v)绑定到一个变量(a)上。在后面的 filter 中可以直接通过变量引用这个值。例如,filter '.$a'表示查询属性名称等于变量 a 的值的属性。
echo '{"name":"voidking"}' | jq .
//这样输出的不带""
echo '{"name":"voidking"}' | jq .name
//这样输出的带 ""
echo '{"name":"voidking"}' | jq -r .name

3.1.2 获取key,value

cat aaa.txt
{"redis_host": "192.168.160.38","redis_port": "6666"}
//获取所有的key,并且不带""
cat aaa.txt | jq  keys[]
//获取所有的key,并且带""
cat aaa.txt | jq -r keys[]//获取key值为redis_host对应的value,并且带""
cat aaa.txt |jq -r .redis_host

3.1.3 串行操作

jq表达式支持串行化操作。一个复杂的表达式可以由多个简单的表达式组成,以管道符号 | 分割,串行化执行。管道前面表达式的输出,是管道后面表达式的输入。

逗号 , 表示对同一个输入应用多个表达式。

echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq .name.firstname
echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq '.name | .firstname'
echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq '.name | .firstname,.lastname'
echo '[{"firstname":"Void","lastname":"King"},{"firstname":"Hao","lastname":"Jin"}]' | jq '.[] | .firstname,.lastname' | sed -n "N;s/\n/ /p"

获取串行json的key

$ cat test.json
{"a": "aa","b": "bb","c": {"dd": "ddd","ee": "eee"}
}//获取根级别的keys:
$ jq -r keys[] test.json
a
b
c获取下层成员的keys:
$ jq .c test.json | jq -r keys[]
dd
ee

3.1.4 数组操作

echo '[{"name":"voidking"},{"name":"haojin"}]' | jq .
echo '[{"name":"voidking"},{"name":"haojin"}]' | jq '.[]'
echo '[{"name":"voidking"},{"name":"haojin"}]' | jq '.[0:2]'
echo '[{"name":"voidking"},{"name":"haojin"}]' | jq '.[0,1]'
echo '[{"name":"voidking"},{"name":"haojin"}]' | jq '.[].name'
echo '[{"name":"voidking"},{"name":"haojin"}]' | jq '.[] | .name'
echo '[{"name":"voidking"},{"name":"haojin"}]' | jq '.[] | .["name"]'

3.1.5 jq运算

echo '{"num":3,"str":"343"}' | jq '.num*3'
echo '{"num":3,"str":"343"}' | jq '.num/3'echo '{"num":3,"str":"343"}' | jq '.str+"3"'
echo '{"num":3,"str":"343"}' | jq '.str*3'
echo '{"num":3,"str":"343"}' | jq '.str/"4"'echo '[{"name":"voidking"},{"name":"haojin"}]' | jq '.+[{"name":"voidking"}]'
echo '[{"name":"voidking"},{"name":"haojin"}]' | jq '.-[{"name":"voidking"}]'echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq '.+{"name":{"nickname":"Hankin"}}'
echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq '.*{"name":{"nickname":"Hankin"}}'echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq '.name.nickname//"Hankin"'jq -n '([1,2]|.[])+([4,6]|.[])'

3.1.6 删除

echo '{"name":{"firstname":"Void","lastname":"King"}}' | jq 'del(.name.firstname)'

3.1.7 映射

在数据处理过程中,我们经常需要将数据从一种形式转换成另外一种形式,或者改变数据的值。
jq提供了两个内置映射函数来实现这种转换:map 和 map_values。其中,map处理的对象是数组,而map_values则处理对象属性的值。map 函数的参数为 filter 表达式。

echo '[1,2,3,4]'| jq -r 'map(.+1)'

3.1.8 过滤

echo '[1,2,3,4]'| jq -r 'map(select(.>2))'
echo '[1,2,3,4]'| jq -r '.[]|select(.>2)'
echo '[{"name":"voidking","age": 18},{"name":"haojin","age": 28}]' | jq '.[]|select(.name=="haojin")'

3.1.9 数组函数

jq 提供内置函数用于完成数组的扁平化(flatten),反序(reverse),排序(sort、sort_by),比较(min、min_by、max、max_by)和查找(indices、index、rindex)。其中indices函数的输入数据可以是数组,也可以是字符串。和 index函数不同的是,其结果是一个包含所有参数在输入数据中位置的数组。

jq -nr '[1,[2,3],4]|flatten'
jq -nr '[1,2,3]|reverse'
jq -nr '[3,1,2]|sort'
jq -nr '[{"a":1},{"a":2}]|sort_by(.a)'
jq -nr '"abcb"|indices("b")'
jq -nr '[1,3,2,3]|indices(3)'

3.1.10 路径

jq中的path是指从根到某个叶子属性的访问路径。
在jq中有两种表示路径的方式:数组表示法和属性表示法。
属性表示法类似于我们在filter中访问某个属性值的方式,如.a.b。
数组表示法是将路径中的每一部分表示为数组的一个元素。
jq提供了一个内置函数path用来实现路径从属性表示法到数组表示法的转换。

jq还提供了函数用来读取路径的值(getpath), 设置路径的值(setpath)和删除路径(del)。
不过这三个函数对路径的处理并不一致。其中getpath和setpath只接受数组表示法的路径,而del函数只能正确处理属性表示法的路径。

jq还提供了一个函数paths用来枚举可能存在的路径。在没有参数的情况下,paths函数将输出JSON数据中所有可能的路径。paths函数可以接受一个过滤器,来只输出满足条件的路径。

jq中提供了一系列的函数用来判断某个元素或者属性是否存在于输入数据中。其中函数has和in用来判断JSON对象或数组是否包含特定的属性或索引。函数contains和inside用来判断参数是否完全包含在输入数据中。对于不同的数据类型,判断是否完全包含的规则不同。对于字符串,如果A是B的子字符串,则认为A完全包含于B。对于对象类型,如果对象A的所有属性在对象B中都能找到且值相同,则认为A完全包含于B。

Shell脚本使用jq解析json相关推荐

  1. 介绍Shell脚本的参数解析工具

    Argbash是一个代码生成器,它为你的脚本生成一个量身定制的解析库.与其他bash模块的通用代码不同,它生成你的脚本所需的最少代码. Argbash是一个代码生成器,它为你的脚本生成一个量身定制的解 ...

  2. linux jq 数组,linux shell脚本 用jq命令在JSON文件肿添加一个map或数组

    导师分配了一个产线日志转换的项目,线上产生的日志是多个文件,可读性不高,需求是把所有的日志转换成JSON文件.每一个字段对应一个值,看起来清晰明了. 之前没写过shell脚本,不知道怎么处理JSON, ...

  3. 100个Shell脚本经典案例解析

    1)编写 hello world 脚本 #!/bin/bash# 编写hello world脚本echo "Hello World!" 2)通过位置变量创建 Linux 系统账户及 ...

  4. 开箱即用:100个Linux Shell脚本经典案例解析

    作者丨baiduoWang 来源丨https://blog.csdn.net/yugemengjing/article/details/82469785 1)编写hello world脚本 #!/bi ...

  5. shell脚本 -- 用途替换所有json文件(main.json 除外)中的 ios下载链接

    #!/bin/bash #脚本用途 替换所有json文件(main.json 除外)中的 ios下载链接 #调用格式 "xxx.sh" (脚本名称) "ios||and& ...

  6. 100个Linux Shell脚本经典案例解析

    1)编写hello world脚本 #!/bin/bash# 编写hello world脚本echo "Hello World!" 2)通过位置变量创建 Linux 系统账户及密码 ...

  7. shell jq 解析json包含点的key

    问题描述 有如下一个json字符串 {"session.id":"aaa"} 需要使用shell解析它,网上查到了一个很好用的解析库jq #正常我们这样解析就行 ...

  8. python 解析模块脚本_Python pexpect模块及shell脚本except原理解析

    expect脚本 expect是什么 expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预.说白了,expect就是一套用来实现自动交互功能的软件. 在实际工作中,我们运行命令. ...

  9. shell脚本实现批量解析域名IP地址(支持多DNS)

    脚本介绍 多DNS解析(目前支持最多3个目标DNS服务器) 支持解析域名的A记录和CNAME记录 自定义DNS,内网DNS服务器,或公网DNS 多域名同时从目标DNS解析记录(脚本从文本读取域名列表) ...

最新文章

  1. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(4月7日)...
  2. 查看apk的签名信息和签名文件的信息
  3. PyODPS学习:使用DataFrame实现SQL的IF判断
  4. 对口高考计算机原理,对口高考计算机原理5.doc
  5. PAT-BASIC-1016-部分A+B
  6. Linux命令之xargs命令详解
  7. Pytorch+MINST 全连接神经网路训练学习
  8. 计算机组成原理—cpu于主存的连接(例题)
  9. Metasploit应用举例
  10. 【转载】jQuery框架
  11. lisp用entmake生产圆柱体_液态基酒生产
  12. uniapp实现上传图片
  13. H5如何获取内网IP和公网IP
  14. 阅读笔记04——魔鬼搭讪学
  15. 网络诊断工具之—IP连接测试ping命令
  16. word文档生成系列:doc和docx插入多图
  17. RecyclerView源码学习笔记(一)构造函数和setLayoutManager方法
  18. 用户留存分析学习整理
  19. 差分信号,共模与差模,共模滤波,差模滤波
  20. 基于java的采购管理系统的分析与实现(含源文件)

热门文章

  1. web前端之CSS3
  2. 查找方法----二分查找
  3. buuctf web [GXYCTF2019]Ping Ping Ping(呜呜呜做个题都要被骂)
  4. mysql的一些介绍
  5. Android支持百分比布局
  6. 模取幂运算 计算a^b mod n
  7. 苹果开发者平台-《测试证书》生成流程
  8. 欧文6 oracle aqua 测评,欧文6实战测评!详细说说
  9. 百度对抗高德 移动导航app进入免费时代
  10. 山不平何以平天下(D题)