Drill 02: Filters & Pipes
Chain operations with pipes, filter with select, transform with map.
Run This Drill
bash ~/atelier/_bibliotheca/domus-captures/docs/modules/ROOT/examples/jq-drills/02-filters.sh
Drill Script
#!/bin/bash
# JQ DRILL 02: FILTERS & PIPES
# Paste this entire script into your terminal
# Topics: Pipe, select, map, keys, values, length
cat << 'EOF' > /tmp/jq-02.json
{
"nodes": [
{"hostname": "ise-01", "ip": "10.50.1.20", "role": "pan", "status": "active", "cpu": 45},
{"hostname": "ise-02", "ip": "10.50.1.21", "role": "psn", "status": "active", "cpu": 78},
{"hostname": "ise-03", "ip": "10.50.1.22", "role": "psn", "status": "standby", "cpu": 12},
{"hostname": "bind-01", "ip": "10.50.1.90", "role": "dns", "status": "active", "cpu": 5},
{"hostname": "bind-02", "ip": "10.50.1.91", "role": "dns", "status": "active", "cpu": 3}
],
"vlans": {
"management": 50,
"data": 10,
"voice": 20,
"guest": 99
}
}
EOF
echo "=================================================================="
echo " JQ DRILL 02: FILTERS & PIPES "
echo "=================================================================="
echo ""
echo "Test file: /tmp/jq-02.json"
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.1: PIPE OPERATOR"
echo "Chain operations with | (like shell pipes)"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.nodes | length' /tmp/jq-02.json"
jq '.nodes | length' /tmp/jq-02.json
echo ""
echo "Command: jq '.nodes[] | .hostname' /tmp/jq-02.json"
jq '.nodes[] | .hostname' /tmp/jq-02.json
echo ""
echo "Command: jq '.vlans | keys' /tmp/jq-02.json"
jq '.vlans | keys' /tmp/jq-02.json
echo ""
echo "Command: jq '.vlans | values' /tmp/jq-02.json"
jq '.vlans | values' /tmp/jq-02.json
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.2: SELECT FILTER"
echo "Filter arrays with select(condition)"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.nodes[] | select(.status == \"active\")' /tmp/jq-02.json"
jq '.nodes[] | select(.status == "active")' /tmp/jq-02.json
echo ""
echo "Command: jq '.nodes[] | select(.cpu > 50)' /tmp/jq-02.json"
jq '.nodes[] | select(.cpu > 50)' /tmp/jq-02.json
echo ""
echo "Command: jq '.nodes[] | select(.role == \"psn\") | .hostname' /tmp/jq-02.json"
jq '.nodes[] | select(.role == "psn") | .hostname' /tmp/jq-02.json
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.3: MAP FUNCTION"
echo "Transform each element: map(expression)"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.nodes | map(.hostname)' /tmp/jq-02.json"
jq '.nodes | map(.hostname)' /tmp/jq-02.json
echo ""
echo "Command: jq '.nodes | map(.cpu)' /tmp/jq-02.json"
jq '.nodes | map(.cpu)' /tmp/jq-02.json
echo ""
echo "Command: jq '.nodes | map(select(.status == \"active\")) | map(.ip)' /tmp/jq-02.json"
jq '.nodes | map(select(.status == "active")) | map(.ip)' /tmp/jq-02.json
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.4: KEYS AND VALUES"
echo "Extract object keys or values"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.vlans | keys' /tmp/jq-02.json"
jq '.vlans | keys' /tmp/jq-02.json
echo ""
echo "Command: jq '.vlans | values' /tmp/jq-02.json"
jq '.vlans | values' /tmp/jq-02.json
echo ""
echo "Command: jq '.nodes[0] | keys' /tmp/jq-02.json"
jq '.nodes[0] | keys' /tmp/jq-02.json
echo ""
echo "Command: jq '.vlans | to_entries' /tmp/jq-02.json"
jq '.vlans | to_entries' /tmp/jq-02.json
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.5: LENGTH AND COUNTING"
echo "Count elements, measure strings"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.nodes | length' /tmp/jq-02.json"
jq '.nodes | length' /tmp/jq-02.json
echo ""
echo "Command: jq '.vlans | length' /tmp/jq-02.json"
jq '.vlans | length' /tmp/jq-02.json
echo ""
echo "Command: jq '[.nodes[] | select(.status == \"active\")] | length' /tmp/jq-02.json"
jq '[.nodes[] | select(.status == "active")] | length' /tmp/jq-02.json
echo ""
echo "Command: jq '.nodes[0].hostname | length' /tmp/jq-02.json"
echo "(String length)"
jq '.nodes[0].hostname | length' /tmp/jq-02.json
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.6: FIRST, LAST, NTH"
echo "Pick specific elements"
echo "------------------------------------------------------------------"
echo ""
echo "Command: jq '.nodes | first' /tmp/jq-02.json"
jq '.nodes | first' /tmp/jq-02.json
echo ""
echo "Command: jq '.nodes | last' /tmp/jq-02.json"
jq '.nodes | last' /tmp/jq-02.json
echo ""
echo "Command: jq '[.nodes[] | select(.role == \"dns\")] | first | .hostname' /tmp/jq-02.json"
jq '[.nodes[] | select(.role == "dns")] | first | .hostname' /tmp/jq-02.json
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "YOUR TURN - TRY THESE:"
echo "------------------------------------------------------------------"
echo ""
echo "1. Count DNS nodes:"
echo " jq '[.nodes[] | select(.role == \"dns\")] | length' /tmp/jq-02.json"
echo ""
echo "2. Get hostnames of nodes with CPU < 20:"
echo " jq '.nodes[] | select(.cpu < 20) | .hostname' /tmp/jq-02.json"
echo ""
echo "3. Get all IPs as array:"
echo " jq '[.nodes[].ip]' /tmp/jq-02.json"
echo ""
echo "------------------------------------------------------------------"
echo "KEY TAKEAWAYS:"
echo "1. | pipes output to next filter"
echo "2. select(cond) filters elements"
echo "3. map(expr) transforms each element"
echo "4. keys/values extract from objects"
echo "5. length counts elements or string chars"
echo "6. first/last pick endpoints"
echo "------------------------------------------------------------------"