亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747


linux 下強(qiáng)大的 JSON 解析命令 jq

 

 

介紹

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 可以對(duì) JSON 數(shù)據(jù)進(jìn)行切片、過(guò)濾、映射和轉(zhuǎn)換,和sed, awk, grep 命令一樣簡(jiǎn)單好用。

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語(yǔ)言編寫的,沒(méi)有運(yùn)行時(shí)依賴。獨(dú)立二進(jìn)制文件,可以使用 scp 復(fù)制到其他服務(wù)器直接運(yùn)行。

安裝

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

# 執(zhí)行權(quán)限
$ chmod +x /usr/local/bin/jq

OS X

$ brew install jq

使用

以 njmon 的 json 輸出來(lái)演示 jq 的常用方式,高級(jí)用法見(jiàn)官方手冊(cè)。

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

標(biāo)準(zhǔn)輸出,即不格式化為帶引號(hào)的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"

數(shù)組

$ 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
}

函數(shù)

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):搜索指定條件內(nèi)容

$ 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):判斷是否存在某個(gè)key

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

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

length:查看輸出長(zhǎng)度或個(gè)數(shù)

# 5 個(gè)字段
$ njmon -s 1 -c 1 | jq '.timestamp | length'
5

# 長(zhǎng)度 19
$ njmon -s 1 -c 1 | jq '.timestamp.datetime | length'
19

實(shí)際場(chǎng)景

nacos 工具腳本

在做自動(dòng)部署腳本時(shí),需要寫個(gè) Nacos 工具腳本,實(shí)現(xiàn)操作 Nacos 實(shí)例狀態(tài)查看、下線、上線等。針對(duì) Nacos 的 json 結(jié)構(gòu)數(shù)據(jù),使用 jq 來(lái)進(jìn)行處理。腳本如下:

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 "tt -instance:查詢某個(gè)健康實(shí)例狀態(tài),true表示在線狀態(tài),false表示下線狀態(tài), 返回空表示實(shí)例不存在"
   echo "tt -instances:查詢健康實(shí)例總數(shù)"
   echo "t SERVICE_NAME 系統(tǒng)名稱"
   echo "t IP 實(shí)例IP"
   echo "t PORT 實(shí)例啟動(dòng)端口號(hào)"
   echo "t FORCE 方法為offline時(shí),true表示強(qiáng)制下線,非true表示校驗(yàn)是否多于2個(gè)健康實(shí)例"
   echo "n"
   echo "示例:"
   echo "t 啟動(dòng):sh $0 instance http://127.0.0.1/nacos ****** serviceName x.x.x.x 8090"
}

# 判斷參數(shù)
if [ $# -lt 4 ];
then
  usage
  exit 1
fi
    
# nacos url
URL=$2
# nacos 命名空間
NAMESPACE_ID=$3
# 系統(tǒng)名稱
SERVICE_NAME=$4
# 實(shí)例 IP地址
IP=$5
# 端口
PORT=$6
# 強(qiáng)制下線標(biāo)識(shí)
FORCE=$7
    
# 查看實(shí)例url
instanceListUrl="$URL/v1/ns/catalog/instances?serviceName=$SERVICE_NAME&clusterName=DEFAULT&pageSize=10&pageNo=1&namespaceId=$NAMESPACE_ID"
# 更新實(shí)例
instanceUrl="$URL/v1/ns/instance?serviceName=$SERVICE_NAME&ip=$IP&port=$PORT&namespaceId=$NAMESPACE_ID"
    
# 查詢健康且上線的實(shí)例個(gè)數(shù)
function instances() {
  echo `curl -X GET -s $instanceListUrl | jq -r ".list[] | select(.healthy == true) | select(.enabled == true) | .ip" | wc -l`
}

# 查詢健康實(shí)例狀態(tài)  在線:true;下線:false, 沒(méi)有查詢到: 空
function instance() {
  echo `curl -X GET -s $instanceListUrl | jq -r ".list[] | select(.ip == "$IP") | select(.port == $PORT) | select(.healthy == true) | .enabled"`
}

# 下線  健康實(shí)例總數(shù)為1時(shí),不可下線唯一的服務(wù)
function offline() {
  if [ "X$FORCE" != "Xtrue" ];then
    counts=`instances`
    if [ $counts -lt 2 ];then
      curl -X GET -s $instanceListUrl | jq .
      echo "$SERVICE_NAME 實(shí)例總數(shù)小于2個(gè),不可下線唯一的服務(wù)!!!"
      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 實(shí)例為上線狀態(tài),無(wú)需執(zhí)行上線!!!"
  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 結(jié)果格式化

njmon與nmon類似,但輸出為 JSON 格式,用于服務(wù)器性能統(tǒng)計(jì)。

$ 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
  },
 ..... 省略其他輸出
}

擴(kuò)展閱讀

  • jq 官網(wǎng):https://stedolan.github.io/jq
  • jq 在線運(yùn)行:https://jqplay.org/

分享到:
標(biāo)簽:linux JSON
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定