介绍

jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.

jq 可以对 JSON 数据进行切片、过滤、映射和转换,和sed, awk, grep 命令一样简单好用。

jq is written in portable C, and it has zero runtime dependencies. You can download a single binary, scp it to a far away machine of the same type, and expect it to work.

jq 是用 C语言编写的,没有运行时依赖。独立二进制文件,可以使用 scp 复制到其他服务器直接运行。

安装

Linux

# 下载 https://stedolan.github.io/jq/download/
$ wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -O /usr/local/bin/jq # 执行权限
$ chmod +x /usr/local/bin/jq

OS X

$ brew install jq

使用

以 njmon 的 json 输出来演示 jq 的常用方式,高级用法见官方手册。

jq "."

以 json格式化输出。

$ njmon -s 1 -c 1 | jq '.'
{
"timestamp": {
"datetime": "2020-03-14T19:59:22",
"UTC": "2020-03-14T11:59:22",
"snapshot_seconds": 1,
"snapshot_maxloops": 1,
"snapshot_loop": 0
},
..... 省略其他输出
}

指定 key 查询

$ njmon -s 1 -c 1 | jq '.timestamp'
{
"datetime": "2020-03-14T20:14:00",
"UTC": "2020-03-14T12:14:00",
"snapshot_seconds": 1,
"snapshot_maxloops": 1,
"snapshot_loop": 0
} $ njmon -s 1 -c 1 | jq '.timestamp.datetime'
"2020-03-14T20:14:43"

--raw-output/-r

标准输出,即不格式化为带引号的json 字符串

$ njmon -s 1 -c 1 | jq '.timestamp.datetime'
"2020-03-14T20:14:43" $ njmon -s 1 -c 1 | jq -r '.timestamp.datetime'
2020-03-14T20:14:43

@csv:格式化输出

还有其他格式方式: @html,@sh,@base64,@base64d等。

$ njmon -s 1 -c 1 | jq -r 'keys' | jq -r '@csv'
"cpu_total","cpuinfo","cpus","disks","filesystems","identity","lscpu","networks","os_release","proc_meminfo","proc_version","proc_vmstat","stat_counters","timestamp","uptime"

数组

$ njmon -s 1 -c 1 | jq '.cpus'
{
"cpu0": {
"user": 0.999,
"nice": 0,
"sys": 0.999,
"idle": 99.87,
"iowait": 0,
"hardirq": 0,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestnice": 0
},
"cpu1": {
"user": 2.996,
"nice": 0,
"sys": 0.999,
"idle": 97.873,
"iowait": 0,
"hardirq": 0,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestnice": 0
}
} $ njmon -s 1 -c 1 | jq '.cpus[]'
{
"user": 0.999,
"nice": 0,
"sys": 0.999,
"idle": 99.92,
"iowait": 0,
"hardirq": 0,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestnice": 0
}
{
"user": 2.998,
"nice": 0,
"sys": 0.999,
"idle": 97.922,
"iowait": 0,
"hardirq": 0,
"softirq": 0,
"steal": 0,
"guest": 0,
"guestnice": 0
}

函数

keys:获取JSON中的key信息

$ njmon -s 1 -c 1 | jq 'keys'
[
"cpu_total",
"cpuinfo",
"cpus",
"disks",
"filesystems",
"identity",
"lscpu",
"networks",
"os_release",
"proc_meminfo",
"proc_version",
"proc_vmstat",
"stat_counters",
"timestamp",
"uptime"
]

select(boolean_expression):搜索指定条件内容

$ njmon -s 1 -c 1 | jq '.filesystems[] | select(.fs_dir == "/home")'
{
"fs_dir": "/home",
"fs_type": "ext4",
"fs_opts": "rw,seclabel,relatime,data=ordered",
"fs_freqs": 0,
"fs_passno": 0,
"fs_bsize": 4096,
"fs_size_mb": 11502,
"fs_free_mb": 11448,
"fs_used_mb": 54,
"fs_full_percent": 0.463,
"fs_avail": 10842,
"fs_files": 757392,
"fs_files_free": 757110,
"fs_namelength": 255
}

has(key):判断是否存在某个key

$ njmon -s 1 -c 1 | jq 'has("cpus")'
true $ njmon -s 1 -c 1 | jq 'has("cpus2")'
false

length:查看输出长度或个数

# 5个字段
$ njmon -s 1 -c 1 | jq '.timestamp | length'
5 # 长度19
$ njmon -s 1 -c 1 | jq '.timestamp.datetime | length'
19

实际场景

nacos 工具脚本

在做自动部署脚本时,需要写个 Nacos 工具脚本,实现操作 Nacos 实例状态查看、下线、上线等。针对 Nacos 的 json 结构数据,使用 jq 来进行处理。脚本如下:

nacosUtils.sh

#!/bin/bash
# Nacos工具脚本 # 使用方法
usage() {
echo "Usage: sh $0 {instance|instances|offline|online} URL NAMESPACE_ID SERVICE_NAME IP PORT [FORCE]"
echo "\n"
echo "\t {instance|instances|offline|online} 方法名称"
echo "\t\t -instance:查询某个健康实例状态,true表示在线状态,false表示下线状态, 返回空表示实例不存在"
echo "\t\t -instances:查询健康实例总数"
echo "\t SERVICE_NAME 系统名称"
echo "\t IP 实例IP"
echo "\t PORT 实例启动端口号"
echo "\t FORCE 方法为offline时,true表示强制下线,非true表示校验是否多于2个健康实例"
echo "\n"
echo "示例:"
echo "\t 启动:sh $0 instance http://127.0.0.1/nacos ****** serviceName x.x.x.x 8090"
} # 判断参数
if [ $# -lt 4 ];
then
usage
exit 1
fi # nacos url
URL=$2
# nacos 命名空间
NAMESPACE_ID=$3
# 系统名称
SERVICE_NAME=$4
# 实例 IP地址
IP=$5
# 端口
PORT=$6
# 强制下线标识
FORCE=$7 # 查看实例url
instanceListUrl="$URL/v1/ns/catalog/instances?serviceName=$SERVICE_NAME&clusterName=DEFAULT&pageSize=10&pageNo=1&namespaceId=$NAMESPACE_ID"
# 更新实例
instanceUrl="$URL/v1/ns/instance?serviceName=$SERVICE_NAME&ip=$IP&port=$PORT&namespaceId=$NAMESPACE_ID" # 查询健康且上线的实例个数
function instances() {
echo `curl -X GET -s $instanceListUrl | jq -r ".list[] | select(.healthy == true) | select(.enabled == true) | .ip" | wc -l`
} # 查询健康实例状态 在线:true;下线:false, 没有查询到: 空
function instance() {
echo `curl -X GET -s $instanceListUrl | jq -r ".list[] | select(.ip == \"$IP\") | select(.port == $PORT) | select(.healthy == true) | .enabled"`
} # 下线 健康实例总数为1时,不可下线唯一的服务
function offline() {
if [ "X$FORCE" != "Xtrue" ];then
counts=`instances`
if [ $counts -lt 2 ];then
curl -X GET -s $instanceListUrl | jq .
echo "$SERVICE_NAME 实例总数小于2个,不可下线唯一的服务!!!"
exit 1
fi
fi result=`curl -X PUT -s "$instanceUrl&enabled=false"`
echo $result
} # 上线
function online() {
enabledFlag=`instance`
if [ "X$enabledFlag" == "Xtrue" ]; then
curl -X GET -s $instanceListUrl | jq .
echo "$SERVICE_NAME 实例为上线状态,无需执行上线!!!"
else
result=`curl -X PUT -s "$instanceUrl&enabled=true"`
fi
echo $result
} case "$1" in
'instance')
instance
;; 'instances')
instances
;; 'offline')
offline
;; 'online')
online
;; *)
usage
exit 1
;;
esac exit 0

njmon 结果格式化

njmon与nmon类似,但输出为 JSON 格式,用于服务器性能统计。

$ njmon -s 1 -c 1 | jq .
{
"timestamp": {
"datetime": "2020-03-14T19:59:22",
"UTC": "2020-03-14T11:59:22",
"snapshot_seconds": 1,
"snapshot_maxloops": 1,
"snapshot_loop": 0
},
..... 省略其他输出
}

扩展阅读

linux 下强大的 JSON 解析命令 jq的更多相关文章

  1. Linux下提权常用小命令

    有些新手朋友在拿到一个webshell后如果看到服务器是Linux或Unix操作系统的就直接放弃提权,认为Linux或Unix下的提权很难,不是大家能做的,其实Linux下的提权并没有很多人想象的那么 ...

  2. Linux下几种文件传输命令

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

  3. Linux下几种文件传输命令 sz rz sftp scp

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

  4. [原创] Linux下几种文件传输命令 sz rz sftp scp介绍

    Linux下几种文件传输命令 sz rz sftp scp介绍 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等 ...

  5. linux下维护服务器之常用命令

    linux下维护服务器之常用命令! 第1套如下: 正则表达式: 1.如何不要文件中的空白行和注释语句: [root@localhost ~]# grep -v '^$' 文件名 |grep -v '^ ...

  6. Ubuntu Linux下设置IP的配置命令

    Ubuntu Linux下设置IP的配置命令 今天装了Ubuntu,但是发现不能上网,开始排查问题: 1.首先确定网络连接是否正确,所用的网线是否可以正常工作 2.查看网卡是否能正常工作,检测的方法如 ...

  7. Linux下的压缩和解压缩命令gzip/gunzip

    作者:邓聪聪 Linux下的压缩和解压缩命令——gzip/gunzip yum -y install zip gzip (--安装压缩工具) gzip命令 gzip命令用来压缩文件.gzip是个使用广 ...

  8. linux下使用screen和ping命令对网络质量进行监控

    linux下使用screen和ping命令对网络质量进行监控 场景:应用连接云服务器经常偶尔会出现连接不上的情况,android和IOS端连接的时候也会出现tcp延时5秒以上,现在想验证是否是云服务商 ...

  9. 在linux下一般用scp这个命令来通过ssh传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...

随机推荐

  1. Web_javaScript

    JavaScript 的使用 第1章 JavaScript起源 1.1 起源 N年前 拨号上网,网速很慢,数据提交到服务器端验证,体验很差 于是,就有人在想:能不能让这些数据在浏览器端验证呢? 20世 ...

  2. Selenium IDE安装及简介

    一.Selenium IDE安装 Selenium IDE是Firefox浏览器的一个插件,依附于Firefox浏览器.在网上搜了Selenium IDE的安装教程,大部分都是说在官网下载安装,其实最 ...

  3. [AI开发]零代码公式让你明白神经网络的输入输出

    这篇文章的标题比较奇怪,网上可能很少类似专门介绍神经网络的输入输出相关文章.在我实际工作和学习过程中,发现很有必要对神经网络的输入和输出做一个比较全面地介绍.跟之前博客一样,本篇文章不会出现相关代码或 ...

  4. 题解 P4325 【[COCI2006-2007#1] Modulo】

    第\(1\)种方法 也是最暴力的一种 我们熟知,\(c++\)中的\(set\)可以既去重,有排序,这题,我们可以用set来搞,虽然我们不需要排序的功能,但毕竟方便,一共是\(10\)个数,所以暴力一 ...

  5. html5 window.postMessage 传递数据的使用

    window.postMessage(图片介绍): 发送方(图片介绍): 接收方(图片介绍): 个人测试一(iframe): 发送方,地址为:http://localhost:63342/HelloH ...

  6. 算法学习 八皇后问题的递归实现 java版 回溯思想

    1.问题描述 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或 ...

  7. effective-java学习笔记---优先使用泛型方法30

    泛型类型比需要在客户端代码中强制转换的类型更安全,更易于使用. 当你设计新的类型时,确保它们可以在没有这种强制转换的情况下使用. 这通常意味着使类型泛型化. 如果你有任何现有的类型,应该是泛型的但实际 ...

  8. Python第七章-面向对象

    面向对象编程基础 一.面向对象概念 1.1 什么是面向过程 ​ 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. ​ 生活中的的例子举例. 1.2 ...

  9. Swagger2 初始用

    1.结合Spring-Boot 引入 pom 依赖  <dependency> <groupId>io.springfox</groupId> <artifa ...

  10. Matlab——m_map指南(4)——实例

    1. 全球/地区温度图 (1)读取数据 clear all setup_nctoolbox %调用工具包 tic %计时 %% nc=ncgeodataset('tmpsfc.gdas.199401. ...