共计 9578 个字符,预计需要花费 24 分钟才能阅读完成。

以往在linux中使用awk/sed来处理临时数据采集的工作,但在处理json这种结构数据时显得有点力不从心,但是有个jq命令却可以方便对json格式数据做处理,以前没怎么用,最近数据采集处理多了特此记录下
jq使用
jq安装
[root@k8s-master ~]# yum install jq -y
[root@k8s-master ~]# echo '{"foo": 0}' | jq .
{
  "foo": 0
}
jq基本使用
样例数据
[root@k8s-master ~]# kubectl get ns monitoring -o json
{
    "apiVersion": "v1",
    "kind": "Namespace",
    "metadata": {
        "annotations": {
            "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"monitoring\"}}\n"
        },
        "creationTimestamp": "2023-03-16T15:58:48Z",
        "labels": {
            "kubernetes.io/metadata.name": "monitoring"
        },
        "name": "monitoring",
        "resourceVersion": "49152",
        "uid": "fc5c167b-9e1e-49dd-aa00-47c3e30d475f"
    },
    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },
    "status": {
        "phase": "Active"
    }
}
jq默认格式化后缩进为2个空格
[root@k8s-master ~]# kubectl get ns monitoring -o json | jq .
{
  "apiVersion": "v1",
  "kind": "Namespace",
  "metadata": {
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"monitoring\"}}\n"
    },
    "creationTimestamp": "2023-03-16T15:58:48Z",
    "labels": {
      "kubernetes.io/metadata.name": "monitoring"
    },
    "name": "monitoring",
    "resourceVersion": "49152",
    "uid": "fc5c167b-9e1e-49dd-aa00-47c3e30d475f"
  },
  "spec": {
    "finalizers": [
      "kubernetes"
    ]
  },
  "status": {
    "phase": "Active"
  }
}
jq获取指定字段
[root@k8s-master ~]# kubectl get ns monitoring -o json | jq .metadata
{
  "annotations": {
    "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"monitoring\"}}\n"
  },
  "creationTimestamp": "2023-03-16T15:58:48Z",
  "labels": {
    "kubernetes.io/metadata.name": "monitoring"
  },
  "name": "monitoring",
  "resourceVersion": "49152",
  "uid": "fc5c167b-9e1e-49dd-aa00-47c3e30d475f"
}
[root@k8s-master ~]# kubectl get ns monitoring -o json | jq .metadata.name
"monitoring"
jq获取多个字段
[root@k8s-master ~]# kubectl get ns monitoring -o json | jq ".metadata.name,.status"
"monitoring"
{
  "phase": "Active"
}
jq迭代处理
jq处理数组或列表
[root@k8s-master ~]# echo '["a","b","c","d","e"]' | jq
[
  "a",
  "b",
  "c",
  "d",
  "e"
]
[root@k8s-master ~]# echo '["a","b","c","d","e"]' | jq '.[2:3]'
[
  "c"
]
[root@k8s-master ~]# echo '["a","b","c","d","e"]' | jq '.[2:4]'
[
  "c",
  "d"
]
[root@k8s-master ~]# echo '["a","b","c","d","e"]' | jq '.[2:]'
[
  "c",
  "d",
  "e"
]
[root@k8s-master ~]# echo '["a","b","c","d","e"]' | jq '.[:4]'
[
  "a",
  "b",
  "c",
  "d"
]
[root@k8s-master ~]# echo '["a","b","c","d","e"]' | jq '.[-2:]'
[
  "d",
  "e"
]
[root@k8s-master ~]# echo '["a","b","c","d","e"]' | jq '.[2,4]'
"c"
"e"
[root@k8s-master ~]# echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq
[
  {
    "name": "JSON",
    "good": true
  },
  {
    "name": "XML",
    "good": false
  }
]
[root@k8s-master ~]# echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq ".[].name"
"JSON"
"XML"
[root@k8s-master ~]# echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq ".[0].name"
"JSON"
[root@k8s-master ~]#
[root@k8s-master ~]# echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq ".[1].name"
"XML"
# 获取ns信息
[root@k8s-master ~]# kubectl get ns -o json | jq '.items[].metadata.name'
"calico-apiserver"
"calico-system"
"default"
"kong"
"kube-node-lease"
"kube-public"
"kube-system"
"monitoring"
"tigera-operator"
[root@k8s-master ~]# kubectl get ns -o json | jq -r '.items[].metadata.name'
calico-apiserver
calico-system
default
kong
kube-node-lease
kube-public
kube-system
monitoring
tigera-operator
jq管道
管道将命令的输出给后面命令作为输入,和系统命令行的管道类似
[root@k8s-master ~]# kubectl get ns -o json | jq -r '.items[] | .metadata.name'
calico-apiserver
calico-system
default
kong
kube-node-lease
kube-public
kube-system
monitoring
tigera-operator
[root@k8s-master ~]# kubectl get ns -o json | jq -r '.items[] | .metadata.name,.metadata.creationTimestamp'
calico-apiserver
2023-03-14T18:58:51Z
calico-system
2023-03-14T18:55:48Z
default
2023-03-14T18:53:41Z
kong
2023-03-15T15:24:29Z
kube-node-lease
2023-03-14T18:53:39Z
kube-public
2023-03-14T18:53:39Z
kube-system
2023-03-14T18:53:39Z
monitoring
2023-03-16T15:58:48Z
tigera-operator
2023-03-14T18:55:07Z
jq运算
[root@k8s-master ~]# echo '[1,2,3,4,5]' | jq '.[] | (. + 2) * 5'
15
20
25
30
35
[root@k8s-master ~]# echo '{"a": [1,2], "b": [3,4]}' | jq '.a + .b'
[
  1,
  2,
  3,
  4
]
[root@k8s-master ~]# echo '["xml", "yaml", "json"]' | jq '. - ["xml", "yaml"]'
[
  "json"
]
jq输出新对象
[root@k8s-master ~]# kubectl get ns kong  -o json | jq "{metadata, test: .status
{
  "metadata": {
    "creationTimestamp": "2023-03-15T15:24:29Z",
    "labels": {
      "kubernetes.io/metadata.name": "kong"
    },
    "name": "kong",
    "resourceVersion": "20554",
    "uid": "64776950-e34f-4be0-94cc-3ff56ca0010f"
  },
  "test": {
    "phase": "Active"
  }
}
jq一些内置函数
length获取长度
[root@k8s-master ~]# kubectl get ns -o json | jq '.items | length'
9
key获取键
[root@k8s-master ~]# kubectl get ns kong  -o json | jq 'keys'
[
  "apiVersion",
  "kind",
  "metadata",
  "spec",
  "status"
]
[root@k8s-master ~]# echo '[4,3,2,1]' | jq 'keys'
[
  0,
  1,
  2,
  3
]
select判断
[root@k8s-master ~]# echo '[1,5,3,0,7]' | jq 'map(select(. >= 2))'
[
5,
3,
7
]
[root@k8s-master ~]# kubectl get pods -A -o json | jq '.items[] | select(.status.qosClass == "BestEffort") | .metadata.name'
"calico-apiserver-868f4c547b-pw452"
"calico-apiserver-868f4c547b-zn96k"
"calico-kube-controllers-77b99b58ff-g8qz6"
"calico-node-srsmd"
"calico-typha-6fb7f79d46-nkqd2"
"echo-5fc5b5bc84-fjkcb"
"echo-5fc5b5bc84-h5smd"
"echo-5fc5b5bc84-hdpdl"
"echo-5fc5b5bc84-rv9jk"
"echo-5fc5b5bc84-sgsrj"
"kong-kong-7959784879-2zlrm"
"kong-kong-init-migrations--1-8r4td"
"kong-kong-pre-upgrade-migrations--1-t5b8d"
"konga-7c477b867b-wfj4j"
"kube-proxy-5pk9h"
"nfs-client-provisioner-6949899dd7-gfvnc"
"tigera-operator-66f6445597-7zgfp"
add相加
[root@k8s-master ~]# echo '["a","b","c"]' | jq 'add'
"abc"
[root@k8s-master ~]# echo '[2,3,4]' | jq 'add'
9
split分割
[root@k8s-master ~]# echo '"a, b,c,d, e, "' | jq -c ' split(", ")'
["a","b,c,d","e",""]
[root@k8s-master ~]# echo '"a-b-c-d-e-"' | jq -c ' split("-")'
["a","b","c","d","e",""]
join联合
[root@k8s-master ~]# echo '["a","b,c,d","e"]' | jq 'join(",")'
"a,b,c,d,e"
[root@k8s-master ~]# echo '["a","b,c,d","e"]' | jq 'join(",") | split(",")'
[
  "a",
  "b",
  "c",
  "d",
  "e"
]
json转换
[root@k8s-master ~]# echo '[1, "foo", ["foo"]]' | jq '[.[]|tostring]'
[
  "1",
  "foo",
  "[\"foo\"]"
]
[root@k8s-master ~]# echo '[1, "foo", ["foo"]]' | jq '[.[]|tojson]'
[
  "1",
  "\"foo\"",
  "[\"foo\"]"
]
[root@k8s-master ~]# kubectl get ns monitoring -o json | jq '.metadata.annotations | ."kubectl.kubernetes.io/last-applied-configuration"'
"{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"monitoring\"}}\n"
[root@k8s-master ~]# kubectl get ns monitoring -o json | jq '.metadata.annotations | ."kubectl.kubernetes.io/last-applied-configuration" | fromjson'
{
  "apiVersion": "v1",
  "kind": "Namespace",
  "metadata": {
    "annotations": {},
    "name": "monitoring"
  }
}
jq示例
获取容器的resources
[root@k8s-master ~]# kubectl get pods -n monitoring -o json | jq -r '.items[] | .metadata.namespace as $ns | .metadata.name as $pod | .spec.containers[] | [$ns, $pod, .name, ((.resources.requests.cpu // "0m")| if endswith("m") then sub("m$"; "") else .| tonumber * 1000  end), ((.resources.limits.cpu // "0m") | if endswith("m") then sub("m$"; "") else .| tonumber * 1000  end), ((.resources.requests.memory // "0Mi")| if endswith("Mi") then sub("Mi$"; "") elif endswith("Gi") then sub("Gi$"; "") | tonumber * 1024 else . end), ((.resources.limits.memory // "0Mi") |if endswith("Mi") then sub("Mi$"; "") elif endswith("Gi") then sub("Gi$"; "") | tonumber * 1024 else . end )] | @tsv' | column -t
monitoring  alertmanager-main-0                   alertmanager               4    100  100  100
monitoring  alertmanager-main-0                   config-reloader            100  100  50   50
monitoring  alertmanager-main-1                   alertmanager               4    100  100  100
monitoring  alertmanager-main-1                   config-reloader            100  100  50   50
monitoring  alertmanager-main-2                   alertmanager               4    100  100  100
monitoring  alertmanager-main-2                   config-reloader            100  100  50   50
monitoring  blackbox-exporter-5c545d55d6-v6fnw    blackbox-exporter          10   20   20   40
monitoring  blackbox-exporter-5c545d55d6-v6fnw    module-configmap-reloader  10   20   20   40
monitoring  blackbox-exporter-5c545d55d6-v6fnw    kube-rbac-proxy            10   20   20   40
monitoring  grafana-7945df75ff-lgg59              grafana                    100  200  100  200
monitoring  kube-state-metrics-54bd6b479c-9vtv2   kube-state-metrics         10   100  190  250
monitoring  kube-state-metrics-54bd6b479c-9vtv2   kube-rbac-proxy-main       20   40   20   40
monitoring  kube-state-metrics-54bd6b479c-9vtv2   kube-rbac-proxy-self       10   20   20   40
monitoring  node-exporter-npcpd                   node-exporter              102  250  180  180
monitoring  node-exporter-npcpd                   kube-rbac-proxy            10   20   20   40
monitoring  prometheus-adapter-7bf7ff5b67-gn66n   prometheus-adapter         102  250  180  180
monitoring  prometheus-adapter-7bf7ff5b67-k8gzg   prometheus-adapter         102  250  180  180
monitoring  prometheus-k8s-0                      prometheus                 0    0    400  0
monitoring  prometheus-k8s-0                      config-reloader            100  100  50   50
monitoring  prometheus-k8s-1                      prometheus                 0    0    400  0
monitoring  prometheus-k8s-1                      config-reloader            100  100  50   50
monitoring  prometheus-operator-54dd69bbf6-6kfql  prometheus-operator        100  200  100  200
monitoring  prometheus-operator-54dd69bbf6-6kfql  kube-rbac-proxy            10   20   20   40获取容器
[root@k8s-master ~]# kubectl get pods -n monitoring -o json | jq -r '.items[] | .metadata.namespace as $ns | .metadata.name as $pod | .spec.containers[].name | [$ns, $pod, .] | @tsv' | column -t
monitoring  alertmanager-main-0                   alertmanager
monitoring  alertmanager-main-0                   config-reloader
monitoring  alertmanager-main-1                   alertmanager
monitoring  alertmanager-main-1                   config-reloader
monitoring  alertmanager-main-2                   alertmanager
monitoring  alertmanager-main-2                   config-reloader
monitoring  blackbox-exporter-5c545d55d6-v6fnw    blackbox-exporter
monitoring  blackbox-exporter-5c545d55d6-v6fnw    module-configmap-reloader
monitoring  blackbox-exporter-5c545d55d6-v6fnw    kube-rbac-proxy
monitoring  grafana-7945df75ff-lgg59              grafana
monitoring  kube-state-metrics-54bd6b479c-9vtv2   kube-state-metrics
monitoring  kube-state-metrics-54bd6b479c-9vtv2   kube-rbac-proxy-main
monitoring  kube-state-metrics-54bd6b479c-9vtv2   kube-rbac-proxy-self
monitoring  node-exporter-npcpd                   node-exporter
monitoring  node-exporter-npcpd                   kube-rbac-proxy
monitoring  prometheus-adapter-7bf7ff5b67-gn66n   prometheus-adapter
monitoring  prometheus-adapter-7bf7ff5b67-k8gzg   prometheus-adapter
monitoring  prometheus-k8s-0                      prometheus
monitoring  prometheus-k8s-0                      config-reloader
monitoring  prometheus-k8s-1                      prometheus
monitoring  prometheus-k8s-1                      config-reloader
monitoring  prometheus-operator-54dd69bbf6-6kfql  prometheus-operator
monitoring  prometheus-operator-54dd69bbf6-6kfql  kube-rbac-proxy
正文完
   
  隐私政策
 隐私政策 留言板
 留言板 金色传说
 金色传说 kubernetes
 kubernetes terraform
 terraform 云生原
 云生原 helm
 helm 代码编程
 代码编程 Java
 Java Python
 Python Shell
 Shell DevOps
 DevOps Ansible
 Ansible Gitlab
 Gitlab Jenkins
 Jenkins 运维
 运维 老司机
 老司机 Linux 杂锦
 Linux 杂锦 Nginx
 Nginx 数据库
 数据库 elasticsearch
 elasticsearch 监控
 监控 上帝视角
 上帝视角 DJI FPV
 DJI FPV DJI mini 3 pro
 DJI mini 3 pro 关于本站
 关于本站