JSON Workshop ------------- ### source .admintools Syntax JSON: oci os ns get #Ausgabe (oci cli macht ein Object daraus und kapselt mit "data") { "data": "frelkczkpnqg" } oci os ns get | jq -M .data # Envelope entfernen und Ergenis monochrom anzeigen "frelkczkpnqg" # Ergibt String oci os ns get | jq -r .data # Tüdelchen entfernen frelkczkpnqg # Gemischte Objekte oci os ns get | jq .data > test.json oci os ns get | jq .data >> test.json oci os ns get | jq . >> test.json cat test.json | jq "frelkczkpnqg" "frelkczkpnqg" { "namespace": "frelkczkpnqg" } # Array echo "[" > meta-array.json oci os ns get | jq .data >> meta-array.json echo "]" >> meta-array.json cat meta-array.json | jq [ "frelkczkpnqg" ] Array mit gemischten Objekten vi meta-array.json [ "frelkczkpnqg-1", "frelkczkpnqg-2", { "namespace": "frelkczkpnqg" } ] cat meta-array.json | jq cat meta-array.json | jq .[] # Alle Elemente ohne die Array Klammer ausgeben cat meta-array.json | jq .[0] # oder "jq first" cat meta-array.json | jq .[1] cat meta-array.json | jq .[-1] # Letztes Element im Array ausgeben oder "jq last" OCI Instance Meta Daten auslesen (V1): curl -skL http://169.254.169.254/opc/v1/instance > meta.json echo "" >> meta.json # Damit letzte Zeile mit LF endet cat meta.json | jq . # Syntax prüfen / Farblich markieren mit "jq" cat meta.json | jq '. | keys_unsorted' # Keys anzeigen lassen cat meta.json | jq '.timeCreated | type' # Type eines keys anzeigen lassen cat meta.json | jq '. | map(type)' # Types aller keys anzeigen lassen cp meta.json meta2.json cat meta.json >> meta2.json vi meta2.json # Values ändern, damit sich die Objekte unterscheiden z.B. state, displayName und timeCreated cat meta2.json | jq . Array bilden: # Fehlversuch, da Komma fehlt echo "[" > meta-array.json cat meta2.json >> meta-array.json echo "]" >> meta-array.json cat meta-array.json | jq . # Funktioniert cat meta2.json | jq --slurp > meta-array.json cat meta-array.json | jq . # Elemente zählen cat meta.json | jq '. | length' cat meta2.json | jq '. | length' cat meta-array.json | jq '. | length' cat meta-array.json | jq '.[] | length' cat meta-array.json | jq '.[0] | length' Object Element ausgeben: cat meta2.json | jq .[0] # Fehler cat meta2.json | jq '. | select(.state=="Running")' # Sucht nach einem bestimmten Wert Array Element ausgeben: cat meta-array.json | jq .[0] # Erstes Element oder "jq first" cat meta-array.json | jq .[1] # Zweites Element cat meta-array.json | jq 'nth(1)' # n-tes Element ausgeben - hier das Zweite cat meta-array.json | jq .[-1] # Letztes Element ausgeben oder "jq last" cat meta-array.json | jq .[] # Alle Objekte ausgeben Defined Tags ausschneiden: curl -skL http://169.254.169.254/opc/v1/instance/definedTags # Meta Daten können dediziert ausgegeben werden curl -skL http://169.254.169.254/opc/v1/instance/definedTags/Oracle-Tags curl -skL http://169.254.169.254/opc/v1/instance/definedTags/Oracle-Tags/CreatedBy cat meta.json | jq .definedTags cat meta2.json | jq .definedTags cat meta-array.json | jq .[].definedTags Oracle-Tags ausschneiden (Sonderzeichen Bindestrich): cat meta.json | jq .definedTags.\"Oracle-Tags\" cat meta2.json | jq .definedTags.\"Oracle-Tags\" Oracle-Tags als Tabelle (TSV) ausgeben: cat meta2.json | jq .definedTags.\"Oracle-Tags\" | jq -r '[.CreatedBy, .CreatedOn] | @tsv' cat meta2.json | jq -r '(.definedTags.'\"Oracle-Tags\"' | [.CreatedBy, .CreatedOn]) | @tsv' > meta2.tsv cat meta2.tsv # Jede Zeile der TSV Datei auslesen while IFS=$'\t' read CreatedBy CreatedOn; do echo "CreatedBy: '$CreatedBy' - CreatedOn: '$CreatedOn'" done < meta2.tsv vi meta2.json # CreatedBy auf null ändern und CreatedOn auf "" cat meta2.json | jq . cat meta2.json | jq -r '(.definedTags.'\"Oracle-Tags\"' | [.CreatedBy, .CreatedOn]) | @tsv' > meta2.tsv # Besserer BASH Code: while IFS=$'\n' read -r line; do hasTab=`echo "$line" | grep -a $'\t'` if [ "$hasTab" != "" ]; then CreatedBy=`echo "$line" | cut -f 1` CreatedOn=`echo "$line" | cut -f 2` echo "CreatedBy: '$CreatedBy' - CreatedOn: '$CreatedOn'" fi done < <(grep . meta2.tsv) Prüfen mit jq, ob Felder leer oder null sind: cat meta2.json | jq -r '(.definedTags.'\"Oracle-Tags\"' | [if has("CreatedBy") then if .CreatedBy == null or .CreatedBy == "" then "empty" else .CreatedBy end else "undefined" end, if has("CreatedOn") then if .CreatedOn == null or .CreatedOn == "" then "empty" else .CreatedOn end else "undefined" end]) | @tsv' > meta2.tsv cat meta2.tsv ------ Instanz Daten mit oci cli auslesen: ocid="ocid1.instance.oc1.eu-frankfurt-1.antheljs55ifkyyckxmdz6xoys77vc3u5jjioswpwq66xna64rfsz4vud3cq" oci compute instance get --instance-id $ocid > inst.json >>> oci compute instance get --instance-id $ocid --raw-output oci compute instance get --instance-id $ocid --output table <<< -> Unterschiede zu Meta Daten und OCI REST API: - Rückgabe per "data" gekapselt (enveloped) - Zusätzliches Key/Value Pair: "etag" - Anstelle von camelCase wird ein Bidestrich genutzt Data Kapselung (Envelope) und etag entfernen cat inst.json | jq .data Oracle-Tags ausschneiden (Sonderzeichen Bindestrich) jetzt: cat inst.json | jq .data | jq .\"defined-tags\".\"Oracle-Tags\" cat inst.json | jq .data.\"defined-tags\".\"Oracle-Tags\" ---------- Basic Admin Scripts installieren: curl -skL https://standby.cloud/download/latest/install-scripts | sudo bash -s basic Download und Beschreibung: https://standby.cloud/ Manual: https://standby.cloud/download/pdf/Basic-Admin-Scripts.pdf ------ Neues Script: transfer (V2 auslesen mit --auth): transfer --help man transfer transfer --auth http://169.254.169.254/opc/v2/instance > meta-v2.json diff meta.json meta-v2.json ------ Neues Script: norm-json oci os ns get | norm-json cat meta2.json | norm-json cat inst.json | norm-json --select 1 > norm-inst.json cat norm-inst.json cat meta.json | jq .definedTags.\"Oracle-Tags\" cat norm-inst.json | jq .definedTags.\"Oracle-Tags\" ------ Neues Script: browse-json cat inst.json | browse-json definedTags --output json cat inst.json | browse-json definedTags --output json | jq .definedTags # Gleiche Ausgabe wie curl -skL http://169.254.169.254/opc/v1/instance/definedTags Einen Value auslesen: cat inst.json | browse-json --raw etag cat inst.json | browse-json definedTags/Oracle-Tags/CreatedBy Array auslesen: cat inst.json | browse-json agentConfig/pluginsConfig[2]/name cat meta2.json | browse-json --select 2 agentConfig/pluginsConfig[2]/name cat meta2.json | browse-json [1]/agentConfig/pluginsConfig[2]/name Vergleich mit Metadaten URL: curl -skL http://169.254.169.254/opc/v1/instance/definedTags cat meta.json | browse-json definedTags --output json curl -skL http://169.254.169.254/opc/v1/instance/definedTags/Oracle-Tags cat meta.json | browse-json definedTags/Oracle-Tags --output json curl -skL http://169.254.169.254/opc/v1/instance/definedTags/Oracle-Tags/CreatedBy cat meta.json | browse-json definedTags/Oracle-Tags/CreatedBy ------ Neues Script: convert-json cat inst.json | convert-json --output etsv | print-table --output json | jq .content cat inst.json | convert-json --output etsv | print-table --output json | norm-json --select 1 cat inst.json | convert-json id,shape,region,lifecycleState cat inst.json | convert-json --level 3 --output etsv | print-table --green true,ENABLED --red false,DISABLED --darkgray null --bold RUNNING --output line cat inst.json | convert-json definedTags/Oracle-Tags --level 2 --output line # or table, tsv, etsv cat meta2.json | convert-json definedTags/Oracle-Tags --level 2 --output table cat meta-array.json | convert-json definedTags/Oracle-Tags --level 2 --output table ----------------------------- ----------------------------- Für Peter: OCI REST API Docs: https://docs.oracle.com/en-us/iaas/api/ oci-api query.eu-frankfurt-1.oci.oraclecloud.com get "/20180409/resourceTypes" | grep '"name": ' | cut -d'"' -f4 > /tmp/resourceTypes.txt while read -r rtype; do echo "resourceTape: '$rtype'" done < /tmp/resourceTypes.txt rtype="Instance" printf '{\n "type": "Structured",\n "query": "query %s resources"\n}\n' "$rtype" > /tmp/request.json oci-api query.eu-frankfurt-1.oci.oraclecloud.com "post" /tmp/request.json "/20180409/resources" >> /tmp/resources.json cat /tmp/resources.json | convert-json identifier,displayName,lifecycleState