Drill 03: Construction

Build new objects and arrays, generate configs with string interpolation.

Run This Drill

bash ~/atelier/_bibliotheca/domus-captures/docs/modules/ROOT/examples/jq-drills/03-construction.sh

Drill Script

#!/bin/bash
# JQ DRILL 03: OBJECT & ARRAY CONSTRUCTION
# Paste this entire script into your terminal
# Topics: Building objects, arrays, string interpolation

cat << 'EOF' > /tmp/jq-03.json
{
  "servers": [
    {"name": "web-01", "ip": "10.50.10.101", "port": 80, "env": "prod"},
    {"name": "web-02", "ip": "10.50.10.102", "port": 80, "env": "prod"},
    {"name": "api-01", "ip": "10.50.10.201", "port": 8080, "env": "prod"},
    {"name": "db-01", "ip": "10.50.10.50", "port": 5432, "env": "prod"},
    {"name": "dev-01", "ip": "10.50.20.10", "port": 8080, "env": "dev"}
  ]
}
EOF

echo "=================================================================="
echo "             JQ DRILL 03: CONSTRUCTION                           "
echo "=================================================================="
echo ""
echo "Test file: /tmp/jq-03.json"
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.1: OBJECT CONSTRUCTION"
echo "Build new objects with {key: value}"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.servers[] | {host: .name, address: .ip}' /tmp/jq-03.json"
jq '.servers[] | {host: .name, address: .ip}' /tmp/jq-03.json
echo ""
echo "Command: jq '.servers[0] | {server: .name, endpoint: \"\\(.ip):\\(.port)\"}' /tmp/jq-03.json"
jq '.servers[0] | {server: .name, endpoint: "\(.ip):\(.port)"}' /tmp/jq-03.json
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.2: SHORTHAND SYNTAX"
echo "When key equals the field name, use {key} shorthand"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.servers[] | {name, ip}' /tmp/jq-03.json"
jq '.servers[] | {name, ip}' /tmp/jq-03.json
echo ""
echo "Command: jq '.servers[] | {name, ip, port}' /tmp/jq-03.json"
jq '.servers[] | {name, ip, port}' /tmp/jq-03.json
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.3: ARRAY CONSTRUCTION"
echo "Wrap in [...] to build arrays"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '[.servers[].name]' /tmp/jq-03.json"
jq '[.servers[].name]' /tmp/jq-03.json
echo ""
echo "Command: jq '[.servers[] | {name, ip}]' /tmp/jq-03.json"
jq '[.servers[] | {name, ip}]' /tmp/jq-03.json
echo ""
echo "Command: jq '[.servers[] | select(.env == \"prod\") | .name]' /tmp/jq-03.json"
jq '[.servers[] | select(.env == "prod") | .name]' /tmp/jq-03.json
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.4: STRING INTERPOLATION"
echo "Build strings with \\(expression)"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq -r '.servers[] | \"Server: \\(.name) at \\(.ip)\"' /tmp/jq-03.json"
jq -r '.servers[] | "Server: \(.name) at \(.ip)"' /tmp/jq-03.json
echo ""
echo "Command: jq -r '.servers[] | \"\\(.ip):\\(.port)\"' /tmp/jq-03.json"
jq -r '.servers[] | "\(.ip):\(.port)"' /tmp/jq-03.json
echo ""
echo "Command: jq -r '.servers[] | \"curl http://\\(.ip):\\(.port)/health\"' /tmp/jq-03.json"
jq -r '.servers[] | "curl http://\(.ip):\(.port)/health"' /tmp/jq-03.json
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.5: TSV AND CSV OUTPUT"
echo "Build delimited output with @tsv, @csv"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq -r '.servers[] | [.name, .ip, .port] | @tsv' /tmp/jq-03.json"
jq -r '.servers[] | [.name, .ip, .port] | @tsv' /tmp/jq-03.json
echo ""
echo "Command: jq -r '.servers[] | [.name, .ip, .port] | @csv' /tmp/jq-03.json"
jq -r '.servers[] | [.name, .ip, .port] | @csv' /tmp/jq-03.json
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.6: ADDING FIELDS"
echo "Add or modify fields with + or |="
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.servers[0] + {status: \"healthy\"}' /tmp/jq-03.json"
jq '.servers[0] + {status: "healthy"}' /tmp/jq-03.json
echo ""
echo "Command: jq '.servers[] | . + {fqdn: \"\\(.name).example.com\"}' /tmp/jq-03.json"
jq '.servers[] | . + {fqdn: "\(.name).example.com"}' /tmp/jq-03.json
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 3.7: PRACTICAL: SSH CONFIG"
echo "Generate ssh_config entries"
echo "------------------------------------------------------------------"
echo ""
echo "Command:"
echo "jq -r '.servers[] | \"Host \\(.name)\\n  HostName \\(.ip)\\n  User admin\\n\"' /tmp/jq-03.json"
jq -r '.servers[] | "Host \(.name)\n  HostName \(.ip)\n  User admin\n"' /tmp/jq-03.json
echo ""

# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "YOUR TURN - TRY THESE:"
echo "------------------------------------------------------------------"
echo ""
echo "1. Build nginx upstream entries:"
echo "   jq -r '.servers[] | select(.port == 80) | \"server \\(.ip):80;\"' /tmp/jq-03.json"
echo ""
echo "2. Create /etc/hosts entries:"
echo "   jq -r '.servers[] | \"\\(.ip) \\(.name)\"' /tmp/jq-03.json"
echo ""
echo "3. Build health check commands:"
echo "   jq -r '.servers[] | \"nc -zv \\(.ip) \\(.port)\"' /tmp/jq-03.json"
echo ""
echo "------------------------------------------------------------------"
echo "KEY TAKEAWAYS:"
echo "1. {key: .value} builds new objects"
echo "2. {name, ip} is shorthand for {name: .name, ip: .ip}"
echo "3. [...] wraps output in array"
echo "4. \"\\(expr)\" for string interpolation"
echo "5. @tsv/@csv for delimited output"
echo "6. + adds/merges objects"
echo "------------------------------------------------------------------"