首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >linux怎么格式化JSON

linux怎么格式化JSON

作者头像
入门笔记
发布于 2022-06-02 09:04:48
发布于 2022-06-02 09:04:48
5.9K00
代码可运行
举报
文章被收录于专栏:入门小站入门小站
运行总次数:0
代码可运行

一、 jq

jq 是一款命令行下处理 JSON 数据的工具。其可以接收标准输入,命令管道或者文件中的 JSON 数据,经过一系列的过滤器(filters)和表达式的转后形成我们需要的数据结构并将结果输出到标准输出中。jq 的这种特性使我们可以很容易地在 Shell 脚本中调用它。

二、安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install -y epel-release
yum install -y jq

三、jq命令参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jq [options] <jq filter> [file...]
options:
-c    使输出紧凑,而不是把每一个JSON对象输出在一行。;
-n    不读取任何输入,过滤器运行使用null作为输入。一般用作从头构建JSON数据。;
-e    set the exit status code based on the output;
-s    读入整个输入流到一个数组(支持过滤);
-r    如果过滤的结果是一个字符串,那么直接写到标准输出(去掉字符串的引号);
-R    read raw strings, not JSON texts;
-C    打开颜色显示;
-M    关闭颜色显示;
-S    sort keys of objects on output;
--tab    use tabs for indentation;
--arg a v    jq 通过该选项提供了和宿主脚本语言交互的能力。该选项将值(v)绑定到一个变量(a)上。在后面的 filter 中可以直接通过变量引用这个值。例如,filter '.$a'表示查询属性名称等于变量 a 的值的属性。;
  --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>;

四、示例

测试数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"snapshots": [{"snapshot": "AAA-api-frame-2019-02-08-2024","uuid": "aMhlAmhrqng","version_id": 7050100,"version": "1","indices": ["AAA-api-frame-2019-02-08"],"include_global_state": false,"state": "SUCCESS","start_time": "2019-02-24T08:53:193Z","end_time": "2019-02-24T08:53:593Z","duration_in_millis": 402,"failures": [],"shards": {"total": 1,"failed": 0,"successful": 1}},{"snapshot": "BBB-api-frame-2019-02-09-2024","uuid": "Wp5MBOFWJA","version_id": 7050199,"version": "1","indices": ["BBB-api-frame-2019-0209"],"include_global_state": false,"state": "SUCCESS","start_time": "2019-02-24T11:04:063Z","end_time": "2020-02-24T11:04:463Z","duration_in_millis": 399,"failures": [],"test": "hah","shards": {"total": 1,"failed": 0,"successful": 1}}]}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "snapshots": [
    {
      "snapshot": "AAA-api-frame-2019-02-08-2024",
      "uuid": "aMhlAmhrqng",
      "version_id": 7050100,
      "version": "1",
      "indices": [
        "AAA-api-frame-2019-02-08"
      ],
      "include_global_state": false,
      "state": "SUCCESS",
      "start_time": "2019-02-24T08:53:193Z",
      "end_time": "2019-02-24T08:53:593Z",
      "duration_in_millis": 402,
      "failures": [],
      "shards": {
        "total": 1,
        "failed": 0,
        "successful": 1
      }
    },
    {
      "snapshot": "BBB-api-frame-2019-02-09-2024",
      "uuid": "Wp5MBOFWJA",
      "version_id": 7050199,
      "version": "1",
      "indices": [
        "BBB-api-frame-2019-0209"
      ],
      "include_global_state": false,
      "state": "SUCCESS",
      "start_time": "2019-02-24T11:04:063Z",
      "end_time": "2020-02-24T11:04:463Z",
      "duration_in_millis": 399,
      "failures": [],
      "test": "hah",
      "shards": {
        "total": 1,
        "failed": 0,
        "successful": 1
      }
    }
  ]
}

1、输出控制

①美化输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.' test.json

②换行与不换行输出

示例数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[{"id": 16176,"iid": 7},{"id": 16173,"iid": 4}]

默认遍历数组中一个对象属性时会换行显示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat test.json | jq -r '.[] | .id , .iid'
16176
7
16173
4

jq 加-j参数,可不换行输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat test.json | jq -jr '.[] | .id , .iid'
161767161734

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat test.json | jq -r '.[] | "\(.id) , \(.iid)"'
16176 , 7
16173 , 4

③输出额外信息

示例数据还使用上一个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat test.json | jq -r '.[] | " id: \(.id) , iid: \(.iid)"'
 id: 16176 , iid: 7
 id: 16173 , iid: 4
$ cat test.json | jq -jr '.[] | " \"" , "IID: " , .iid , " ID: " , .id ,"\""  '
 "IID: 7 ID: 16176" "IID: 4 ID: 16173"

④格式化输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat test.json | jq -r '[.id,.iid] as [$id,$iid] | "\($id) -|- \($iid)"'
1 -|- 11
22 -|- 21

⑤以Key=value的形式输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jq -r '.snapshots[].shards|to_entries[]|"\(.key | ascii_upcase)=\(.value)"' test.json
TOTAL=1
FAILED=0
SUCCESSFUL=1

⑥压缩输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jq -c '.' test.json

2、访问属性值

①输出属性的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots[].snapshot' test.json
$ jq -r '.snapshots[].snapshot,.snapshots[].end_time' test.json
# 如果属性名中有空格,需要加双引号
$ jq -r '."with space"' test.json
$ jq -r '"\(."@timestamp") \(.end_time)"'  test.json

②批量访问属性值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots[] | [.snapshot,.end_time] test.json

3、操作属性值

①取值赋予变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat test.json | jq -r '[.id,.iid] as [$id,$iid] | "\($id)|\($iid)"'

4、JSON数组的操作

①遍历访问数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots[]' test.json
$ jq -r '.snapshots[] | .snapshot' test.json
$ jq -r '.snapshots[].snapshot' test.json

②按索引访问数组

获取snapshot的index

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots[0]' test.json
$ jq -r '.snapshots[1].indices[0]' test.json

③数组切片

只取数组指定位置的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 从0开始到第一个
$ jq -r '.snapshots[0:1]' test.json
# 从头开始到第一个
$ jq -r '.snapshots[:1]' test.json
# 倒数一个到最后一个
$ jq -r '.snapshots[-1:]' test.json

5、函数操作

①keys:获取有哪些属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots[] | keys' test.json

②length:获取属性的个数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots[] | length' test.json

③min/max:大小的比较

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '[.snapshots[].indices[0]] | min' test.json
$ jq -r '[.snapshots[].indices[0]] | max' test.json

④ select:筛选过滤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots[] | select(.duration_in_millis < 400)' test.json
# 如果属性值不是整型,而是字符型。例如 duration_in_millis: "300"
$ jq -r '.snapshots[] | select(.duration_in_millis < "400") | .end_time , .version_id' test.json
$ jq -r '.snapshots[] | select(.duration_in_millis < "400") | "\(.end_time) \(.version_id)"' test.json
$ jq -r '.snapshots[] | select(.duration_in_millis < 400 and .state=="SUCCESS" )' test.json
# 精准匹配
$ jq -r ' .snapshots[] | .[] | select( .uuid == "Wp5MBOFWJA" )  ' test.json
# 精准匹配:反向选择
$ jq -r ' .snapshots[] | .[] | select( .uuid | . != "Wp5MBOFWJA") | "\($id)|\($iid)"' test.json
# 模糊匹配
jq '.[] |= map(select(.source | contains("/log/app/stg/pressure-server/"))' filebeat-registry.json

⑤select:正则表达式筛选过滤

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots[] | select(.snapshot|test("^BBB.*") ) | .version_id' test.json

⑥del:删除属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r 'del(.snapshots[].version)' test.json
# 删除匹配到的属性
$ jq -r 'del( .snapshots[] | select(.uuid == "Wp5MBOFWJA"))'  test.json > test-deled.json

⑦map:map属性值进行操作

判断属性值是否存在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots | map(has("snapshot"))' test.json

操作数值类型的属性值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots | map(.duration_in_millis+2)' test.json

⑧unique:去重属性值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots | map(.state) | unique' test.json

⑨重组json结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r '.snapshots | map(.) | .[] | {"快照名": .snapshot,"快照的索引": .indices}' test.json
{
  "快照名": "AAA-api-frame-2019-02-08-2024",
  "快照的索引": [
    "AAA-api-frame-2019-02-08"
  ]
}
{
  "快照名": "BBB-api-frame-2019-02-09-2024",
  "快照的索引": [
    "BBB-api-frame-2019-0209"
  ]
}

⑩if else 函数判断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ jq -r ' .snapshots[] 
| if .snapshot == "" then .value |= "值为空" else . end
| "\(.id)= \(.iid)" '
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 入门小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Elasticsearch集群数据备份与恢复 Snapshot & Restore
简介 Elasticsearch 拥有副本机制来保障集群的高可用,然而无法解决如下情况的数据丢失: 主副本所在机器存储全部损坏。 误删除索引数据。 升级失败,数据无法回滚。 定期对数据做备份,按需恢复可以很好的解决如上问题。 Elasticsearch 提供了 Snapshot 和 Restore API 用于对集群数据完成备份与恢复。 数据备份的过程可以简单理解成将本地数据文件同步到远程仓库(repository) 的过程。 支持全量和增量备份。 repository 常见有如下类型: fs / S3 /
Se7en258
2021/05/18
1.8K2
Elasticsearch(ES)备份与快照(Snapshot)
作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/09/30
1230
Elasticsearch(ES)备份与快照(Snapshot)
腾讯云ES集群通过COS实现跨地域备份与恢复
在日常开发及运维工作中,我们经常会遇到一些内外部的客户希望将不同地域的es集群迁移到另外一个地域。例如有的客户es集群原来是在北京地域,由于一些原因,现在想要将集群迁移到上海地域来。下面我们就详细介绍下借助腾讯云COS和es的snapshot功能来实现跨地域的数据迁移。
腾讯云大数据
2021/01/08
1.5K0
腾讯云ES集群通过COS实现跨地域备份与恢复
Elasticsearch 跨集群数据迁移方案总结
elasticsearch-dump是一款开源的ES数据迁移工具, github地址: https://github.com/taskrabbit/elasticsearch-dump
Se7en258
2021/05/18
4.9K0
Elasticsearch 跨集群数据迁移方案总结
Elasticsearch 备份数据到
系统版本:centos 7.3 安装方式 : yum ES版本环境: 6.0.1
py3study
2020/01/07
2.6K0
Elastic Stack 实战教程 3:快照备份与恢复
Elasticsearch 提供快照和恢复功能,我们可以在远程文件系统仓库(比如共享文件系统、S3、HDFS 等)中为部分索引或者整个集群创建快照。快照有以下使用场景:
Se7en258
2023/02/26
1.8K0
Elastic Stack 实战教程 3:快照备份与恢复
腾讯云ES集群通过COS实现跨地域备份与恢复
在日常开发及运维工作中,我们经常会遇到一些内外部的客户希望将不同地域的es集群迁移到另外一个地域。例如有的客户es集群原来是在北京地域,由于一些原因,现在想要将集群迁移到上海地域来。下面我们就详细介绍下借助腾讯云COS和es的snapshot功能来实现跨地域的数据迁移。
吴容
2020/07/29
3K1
腾讯云ES集群通过COS实现跨地域备份与恢复
【玩转腾讯云】通过COS快照从自建ES迁移至腾讯云最佳实践
在腾讯云同一个VPC内使用3台CVM部署自建ES集群,可以通过给自建Elasticsearch打快照存储到COS,在利用COS中的快照进行数据库恢复,将自建Elasticsearch数据迁移至腾讯云Elasticsearch。
Vicwan
2020/04/08
3.3K0
ES快照原理
快照模块是 ES 备份、迁移数据的重要手段。ES 快照支持增量备份,支持多种类型的仓库存储。
leobhao
2024/05/26
7250
ES快照原理
通过COS快照从自建ES迁移至腾讯云最佳实践
作者介绍 万守兵:腾讯云行业架构师,对云上双活架构、迁移方案有比较深的了解,现主要负责腾讯云泛互行业TOP级客户的解决方案架构工作。 一 场景介绍 在腾讯云同一个VPC内使用3台CVM部署自建ES集群,可以通过给自建Elasticsearch打快照存储到COS,在利用COS中的快照进行数据库恢复,将自建Elasticsearch数据迁移至腾讯云Elasticsearch。 腾讯云 Elasticsearch Service(ES)是基于开源搜索引擎 Elasticsearch 打造的高可用、可
云存储
2020/06/29
2.1K1
Elasticsearch升级踩坑记之使用snapshot备份数据
参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/modules-snapshots.html 环境:有三台机器192.168.1.146,192.168.1.151,192.168.1.152,系统均是Centos7,上面分别安装了elasticsearch2.4.6(为了学习之用才安装的2.4.6版本)。
我是李超人
2020/08/21
8670
白话Elasticsearch72_利用HDFS备份与恢复ES生产集群的数据
本篇博文不会涉及非常详细的操作步骤截图,仅把备份与恢复的关键步骤记录,等后续有真正的使用场景的时候,再来实操。
小小工匠
2021/08/17
8190
【Elasticsearch系列之三】腾讯云ES云上安全优化
Elasticsearch本身是分布式多副本的,在此基础上腾讯云ES进一步提供高可用数据安全能力,您可以根据自身业务情况来选择相应的安全方案,具体如下:
Vicwan
2020/04/14
1.6K0
Elasticsearch 数据离线迁移方案(含冷热分层场景)
本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。
岳涛
2023/06/13
3.9K0
Elasticsearch 数据离线迁移方案(含冷热分层场景)
shell 格式化json(python json.loads)
jq手册参考地址:https://stedolan.github.io/jq/manual/#Advancedfeatures
全栈程序员站长
2022/08/01
1.3K0
Elasticsearch 快照生命周期管理 (SLM) 实战指南
关于如何创建快照和恢复快照,可以参考这篇:干货 | Elasitcsearch7.X集群/索引备份与恢复实战。
铭毅天下
2022/05/23
1.7K0
Elasticsearch 快照生命周期管理 (SLM) 实战指南
Elasticsearch集群数据迁移
https://www.elastic.co/guide/en/elasticsearch/reference/5.0/modules-snapshots.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_rolling_restarts.html https://blog.csdn.net/u014431852/article/details/52905821
三杯水Plus
2018/11/14
2.2K0
ELK运维文档
用于查看Node级别的基本信息,选参数为pipelines、os和jvm,如下查看基本的os和jvm信息:
charlieroro
2024/01/26
1.3K0
ELK运维文档
自建ES集群迁移至腾讯云ES的几种方案介绍
随着腾讯云Elasticsearch产品功能越来越丰富、产品体验越来越好。越来越多的客户将自建的ES集群或者部署在其他云厂商的 ES 集群迁移到腾讯云上来。为了更加方便快捷地帮助客户完成集群迁移工作,下面简单介绍下可提供的两种迁移方案,离线迁移和在线迁移。
吴容
2020/07/28
4.4K0
自建ES集群迁移至腾讯云ES的几种方案介绍
《Elasticsearch 源码解析与优化实战》第13章:Snapshot 模块分析
快照模块是ES备份、迁移数据的重要手段。它支持增量备份,支持多种类型的仓库存储。本章我们先来看看如何使用快照,以及它的一些细节特性,然后分析创建、删除及取消快照的实现原理。
HLee
2021/06/17
2K1
《Elasticsearch 源码解析与优化实战》第13章:Snapshot 模块分析
推荐阅读
相关推荐
Elasticsearch集群数据备份与恢复 Snapshot & Restore
更多 >
LV.6
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档