0
votes

impossible d'analyser la valeur de la clé à partir de la réponse de la valeur de la clé json

Équipe,

J'ai la sortie ci-dessous et la requête json, mais je ne parviens pas à récupérer la valeur à côté de mode.

jq: error (at <stdin>:19): null (null) cannot be matched, as it is not a string
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): Cannot index string with string "mode"

De plus, y a-t-il un moyen de simplement le tirer en utilisant awk?

Essayé:

kubectl get configmap -n kube-system kube-proxy -o json | jq .data.\"config.conf\".mode
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"
}


0 commentaires

5 Réponses :


0
votes

En utilisant jq -r .data. \ "config.conf \" vous obtenez le contenu brut de config.conf , que vous pouvez ensuite facilement grep ou autre, ils ne sont pas json.


0 commentaires

3
votes

Voici une solution jq uniquement:

iptables

Résultat en utilisant l'option de ligne de commande -r:

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

option -f

Plutôt que de vous battre avec votre shell, envisagez d'utiliser l'option de ligne de commande -f de jq, ou créez un script exécutable.


4 commentaires

c'est gentil


je n'utilise pas la bonne syntaxe? kubectl get configmap -n kube-system kube-proxy -o json | jq. ["config.conf"] | splits ("\ n") -bash: erreur de syntaxe près du jeton inattendu `" \ n "'


@AhmFM avec n'importe quel outil (sed, awk, perl, jq, peu importe), vous devez mettre les scripts de ligne de commande entre guillemets: jq -r '. ["Config.conf"] | se divise ("\ n") | select (test ("^ mode")) | [scinde (": *")] | . [1] 'fichier


@AhmFM - Le filtre que j'ai initialement donné était pour la sortie que vous avez montrée. J'ai ajouté le .data pour éviter toute confusion.



0
votes

Sans un outil compatible JSON, une solution va être assez difficile ou très piratée. Si vous cherchez quelque chose dans cette dernière catégorie, vous n'avez pas besoin d'aller plus loin que:

sed 's/\\n/\
/g' | grep '^ *mode:' | sed 's/ *mode: *//'


0 commentaires

0
votes

Faire cela de manière aussi robuste que raisonnablement possible dans awk serait (en utilisant GNU awk pour le 3ème argument à match ()):

$ 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

Il vous suffirait de comprendre comment vous veulent gérer les balises en double comme "nom" dans les données. Il semble qu'il y ait peut-être un troisième niveau de hiérarchie dans votre fichier que vous devrez gérer si vous voulez obtenir ces valeurs.


0 commentaires

0
votes

J'ai résolu avec lui les combinaisons jq et yq

"iptables"

sortie:

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


0 commentaires