0

团队,

我有以下输出和 json 查询,但无法检索模式旁边的值。

kubectl get configmap -n kube-system kube-proxy -o json | jq .data

{
  "config.conf": "apiVersion: kubeproxy.config.k8s.io/v1alpha1\nbindAddress: 0.0.0.0\nclientConnection:\n  acceptContentTypes: \"\"\n  burst: 10\n  contentType: application/vnd.kubernetes.protobuf\n  kubeconfig: /var/lib/kube-proxy/kubeconfig.conf\n  qps: 5\nclusterCIDR: 10.233.64.0/18\nconfigSyncPeriod: 15m0s\nconntrack:\n  max: null\n  maxPerCore: 32768\n  min: 131072\n  tcpCloseWaitTimeout: 1h0m0s\n  tcpEstablishedTimeout: 24h0m0s\nenableProfiling: false\nhealthzBindAddress: 0.0.0.0:10256\nhostnameOverride: hosta\niptables:\n  masqueradeAll: false\n  masqueradeBit: 14\n  minSyncPeriod: 0s\n  syncPeriod: 30s\nipvs:\n  excludeCIDRs: null\n  minSyncPeriod: 0s\n  scheduler: rr\n  syncPeriod: 30s\nkind: KubeProxyConfiguration\nmetricsBindAddress: 127.0.0.1:10249\nmode: iptables\nnodePortAddresses: []\noomScoreAdj: -999\nportRange: \"\"\nresourceContainer: /kube-proxy\nudpIdleTimeout: 250ms",
  "kubeconfig.conf": "apiVersion: v1\nkind: Config\nclusters:\n- cluster:\n    certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt\n    server: https://127.0.0.1:6443\n  name: default\ncontexts:\n- context:\n    cluster: default\n    namespace: default\n    user: default\n  name: default\ncurrent-context: default\nusers:\n- name: default\n  user:\n    tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token"
}
kubectl get configmap -n kube-system kube-proxy -o json | jq .data.\"config.conf\".mode
jq: error (at <stdin>:19): Cannot index string with string "mode"

另外,有没有办法使用 awk 来拉它?

试过:

kubectl get configmap -n kube-system kube-proxy -o json | jq -r '.["config.conf"] | splits("\n") | select( test("^mode") ) | [splits(": *")] | .[1]'
jq: error (at <stdin>:19): null (null) cannot be matched, as it is not a string
4

5 回答 5

3

这是一个仅限 jq 的解决方案:

.data
| .["config.conf"]
| splits("\n")
| select( test("^mode") )
| [splits(": *")]
| .[1]

使用 -r 命令行选项的结果:

iptables

-f 选项

考虑使用 jq 的 -f 命令行选项,或者创建一个可执行脚本,而不是与你的 shell 竞争。

于 2019-11-04T22:23:29.707 回答
0

如果没有支持 JSON 的工具,解决方案将非常困难,或者非常骇人听闻。如果您正在寻找后一类的东西,您只需:

sed 's/\\n/\
/g' | grep '^ *mode:' | sed 's/ *mode: *//'
于 2019-11-04T23:12:54.537 回答
0

在 awk 中尽可能合理地做到这一点是(使用 GNU awk 作为第三个参数来匹配()):

$ cat tst.awk
{
    file = ""
    delete f
}
match($0,/"([^"]+)"[^"]+"(.*)"/,a) {
    file = a[1]
    numTags = split(a[2],tagsVals,/\\n/)
    for (i=1; i<=numTags; i++) {
        tag = val = tagsVals[i]
        gsub(/^\s+|\s*:.*/,"",tag)
        gsub(/^[^:]+:\s*|\s+$/,"",val)
        f[tag] = val
    }
}
(tgtFile == file) && (tgtVal in f) { print f[tgtVal] }

$ awk -v tgtFile='config.conf' -v tgtVal='mode' -f tst.awk file
iptables

$ awk -v tgtFile='config.conf' -v tgtVal='contentType' -f tst.awk file
application/vnd.kubernetes.protobuf

您只需要弄清楚如何处理数据中的重复标签,例如“名称”。如果您想获得这些值,您的文件中可能需要处理第三级层次结构。

于 2019-11-05T01:45:12.660 回答
0

我用它解决了 jq 和 yq 组合

kubectl get configmap -n kube-system kube-proxy -o json | jq -r '.data."config.conf" ' | yq '.mode'

输出:

"iptables"
于 2019-11-06T07:34:29.520 回答
0

通过使用jq -r .data.\"config.conf\",您可以获得原始内容config.conf,然后您可以轻松地 grep 或其他内容,它们不是 json。

于 2019-11-04T22:22:47.043 回答