Linux杂谈之jq命令

一   JSON

(1)什么是json

1) JSON 是最常用的'配置'和'数据交换'格式之一,全称JavaScript Object Notation

 特点: 一种与'开发语言无关-->独立于语言的文本格式'的、'轻量级'的数据存储格式

 场景: 大量的系统'API接口'现在基本上都是以'JSON格式'显示结果

2) 一种数据格式的'标准规范-->事实标准'

备注:起初'来源'于'js'这门语言,后来随着使用的广泛,几乎'每门开发语言'都有处理JSON的API

3) 优点:易于人的'阅读'和'编写',易于机器'解析'与'生成'

(2)数据类型

数据结构:object-->'{}'、array-->'[]'

基本类型:string、number、true、false、null -->'6种'

后续: null和'空串'的区别

1) 一个'花括号'{},整个代表一个对象-->'object'

  特点: 里面的元素必须是'key:value',以','隔开

  补充: 对象是一个'无序'的'key/value对'集合

2) 一个'方括号'[],整个代表一个数组-->'array' 

  特点: 数组是'值'的'有序'集合,值之间以','分割

  补充: '值'可以是"双引号"包括的string、number、true、false、null、object、arrary

  理解: 'value'是广义上的'单个元素',可以'通过'{}、'[]'嵌套来'实现'复杂的数据结构

3) json仅支持'UTF-8'编码,且不支持'注释'

了解JSON schema 

(3)基础

key: 一般是'string'类型,用"双引号"!!!  

  强调: 不是'单引号'!!!

  补充: 双引号包括的字符串能解析"\t、\n"等符号

value:'任何'基本类型或数据结构

细节: 最后一个'不要加逗号',加了会'出错'

json语法在线合法检查 

(4)高级

核心:数据结构之间的'嵌套'

场景:很多时候,服务器返回的JSON都"不是一个扁平"的结构,而是'包含了各种嵌套'

强调:一般'json结构'保持一样

理解: 类似于C的'struct'结构体,自己'自由'组合

json schema生成 

①    对象封装数组

②    数组作为JSON根对象

③    纯数组中的对象带有唯一key

④    更一般形式

处理 JSON null 和空数组及对象

json从入门到精通

二   jq

在自动化部署中涉及到shell脚本需要'动态读取'很多'配置文件',最好是'json格式'

(1)各种语言处理json

Jackjson与FastJson区别

fastjson漏洞

(2)jq简介

1) jq是一个'出色'的命令行'针对-->JSON处理器',提供了用于查询、操作和使用JSON文件的大量功能,而且作为一个'命令行工具',可'配合UNIX管道'使用,'单行脚本'处理JSON

2) jq可以对json数据进行'分片'、'过滤'、'映射'、'转换';和sed、awk、grep等命令一样,可以让你'轻松'地把玩文本

3) 它能'轻松地'把你拥有的数据'转换成'你期望的格式,而且需要写的程序通常也'比你期望'的更加简短

4) jq是用'C编写','没有'运行时依赖,所以几乎可以运行在'任何系统'上

5) 预编译的二进制文件可以'直接在'Linux、OS X和windows系统上运行

注意:jq'不是'曾经流行的'JS库'Jquery的'缩写'

(3)jq安装

jq官网

1) Debian、'Ubuntu'系:sudo apt-get install jq

2) Redhat、'Centos'系:sudo yum install jq -->'7' 或 sudo dnf install jq -->'8'

备注:当前'采用'-->'Centos7.7'

3) openSUSE:sudo zypper install jq

4) Arch:sudo pacman -Sy jq

5) Mac OS:使用'Homebrew安装'-->brew install jq

5) Windows:使用Chocolatey NuGet或者直接下载'官方二进制包'

   chocolatey install jq

源码安装

(4)jq实践

①  json数据格式化

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

直接'格式化'打印

+++++++++'所作的事情'+++++++++

1)'首先'检查json'语法格式' -->'不符合'则'报错'

2)'然后'格式'正确',会进行'format格式化'

github api调用

curl -s -o example.json https://api.github.com/users/jianzhiwang/repos

②     jq命令详解

jq [options] filter [files]

1) **options:**
--version:           输出'jq的版本信息'并退出
--slurp/-s:          读入'整个输入'流到一个'数组'
--raw-input/-R:      '不作为JSON解析',将每一行的文本作为字符串'输出到屏幕'
--null-input/ -n:    不读取任何输入,过滤器运行使用null作为输入;一般用作'从头构建JSON'数据
--compact-output /-c:使输出紧凑,而'不是'把每一个JSON对象'输出在一行'
--colour-output / -C:打开'颜色'显示
--monochrome-output / -M:关闭颜色显示

--ascii-output /-a:  指定'输出格式'为ASCII

-raw-output /-r :    如果过滤的结果是一个字符串,那么直接写到标准输出(去掉字符串的引号)

2) **filter:**
.   :     默认'输出'
.foo:     输出指定'属性',foo代表属性。
.[foo] : 输出指定'数组元素',foo代表'数组下标'
.[]:     输出指定数组中'全部元素'
, :      指定'多个属性'作为过滤条件时,用'逗号分隔'
| :      将指定的数组元素中的'某个属性'作为'过滤条件'

3) **files:**
    JOSN格式文件

③    直接取map的某个key对应的value

备注: 'map'可以理解为'object'-->元素是"key":"value"的形式

④    获取第一个数组的元素

jq 的键查询也支持'链式调用'

⑤    获取所有的数组元素

jq  '.list[].meta' ceshi7.json

[]中如果'为空'表示获取所有的'数组元素' -->'有层级'

过滤'多个值'-->'以逗号隔开'

echo '[{"a":1,"b":2},{"c":3,"d":4}]' | jq .[0,1]

备注: 多个键搜索,中间用'逗号'分开

⑥    jq相关参数

uesr_name代表键,$name代表name这个变量即前面的okok,这个变量可以是'交互型'的

'-c'选项:该选项控制 jq 是输出 'raw 格式'内容或 json 格式化'pretty'内容

'-r'选项:去掉字符串的引号'"'

⑦    重组

1) 数据重'组成数组'-->"[]"
echo '{"a":1,"b":2,"c":3,"d":4}' | jq '[.a,.b]'

2) 数据重'组成对象'-->"{}"
echo '{"a":1,"b":2,"c":3,"d":4}' | jq '{"tmp":.b}'

⑧    管道线|

jq'支持'管道线 |,它'如同'linux命令中的管道线,把'前面命令的输出'当作是'后面命令的输入'

eg:如下命令把'.[0]作为{…}的输入',进而'访问嵌套'的属性

备注:这里我们使用管道'过滤'并'构造'出meta对象

补充: 也是'重组'

细节: { key} -->'将key和key对应的value组成map'

jq '.[0] | {name:.arrayBrowser[1].name,city:.address.city}'

注意: '|'里面的'.'是相对于第一个[0]的

 ⑨    jq的内建函数

1)判断

1、'has'是用来是判断'是否存在'某个key-->'true'、'false'

jq 'has("sign")'

2)筛选 

jq 'select(.age > 24) | {name}' wzj.json

{
  "name": "shuifeng"
}

3)计算 1

echo '{"a": 1 , "b": 2}'|jq '.a+100'

101

4)删除json键

jq也支持从JSON对象中删除键,'删除后输出'就'不包含'删除key的JSON对象。删除键使用del()函数,还是以wzj.json为例:

jq 'del(.owner)' wzj.json

结果中就不包括owner键了

5)计算2 

jq可以映射值并在'每个值上'执行操作

备注: 数组中的'每个键'进行映射并做数值计算'加2'

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

[

3,

4,

5,

6,

7,

8

]

⑩    小结

1)  必须要在'命令行'下处理 JSON,强烈'推荐 jq'

2)  jq '不仅'可以满足一般性的常见需求,更包括运算、内置函数、条件比較、 变量声明、自定函数等'强大'功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值