jq Session 03: Construction

Creating new data structures. This session covers object construction, array building, CSV output, and string interpolation.

Pre-Session State

  • Can filter with select()

  • Can transform with map()

  • Understand pipe operator

Setup

cat > /tmp/jq-sessions.json << 'EOF'
[
  {"mac": "AA:BB:CC:11:22:33", "ip": "10.50.10.100", "user": "evanusmodestus", "vlan": 10},
  {"mac": "AA:BB:CC:44:55:66", "ip": "10.50.10.101", "user": "gabriel", "vlan": 10},
  {"mac": "DD:EE:FF:77:88:99", "ip": "10.50.20.50", "user": "guest", "vlan": 20}
]
EOF

Lesson 1: Object Construction

Concept: Use {key: value} to build new objects.

Exercise 1.1: Build simple object

cat /tmp/jq-sessions.json | jq '.[] | {endpoint: .mac, address: .ip}'

Output: New objects with renamed fields.

Exercise 1.2: Include literal values

cat /tmp/jq-sessions.json | jq '.[] | {mac: .mac, ip: .ip, source: "ise"}'

Output: Objects with added static field.

Exercise 1.3: Shorthand syntax

cat /tmp/jq-sessions.json | jq '.[] | {mac, ip, user}'

Output: Same as {mac: .mac, ip: .ip, user: .user}.

Lesson 2: Array Construction

Concept: Use […​] to build arrays.

Exercise 2.1: Collect into array

cat /tmp/jq-sessions.json | jq '[.[] | .ip]'

Output: ["10.50.10.100", "10.50.10.101", "10.50.20.50"]

Exercise 2.2: Build tuple arrays

cat /tmp/jq-sessions.json | jq '.[] | [.user, .ip, .vlan]'

Output: Arrays like ["evanusmodestus", "10.50.10.100", 10]

Lesson 3: CSV Output

Concept: Use @csv to format arrays as CSV.

Exercise 3.1: Basic CSV

cat /tmp/jq-sessions.json | jq -r '.[] | [.user, .ip, .vlan] | @csv'

Output:

"evanusmodestus","10.50.10.100",10
"gabriel","10.50.10.101",10
"guest","10.50.20.50",20

Exercise 3.2: CSV with header

cat /tmp/jq-sessions.json | jq -r '["user","ip","vlan"], (.[] | [.user, .ip, .vlan]) | @csv'

Output: CSV with header row first.

Exercise 3.3: TSV output

cat /tmp/jq-sessions.json | jq -r '.[] | [.user, .ip, .vlan] | @tsv'

Output: Tab-separated values.

Lesson 4: String Interpolation

Concept: Use \(expr) inside strings for interpolation.

Exercise 4.1: Build formatted string

cat /tmp/jq-sessions.json | jq -r '.[] | "User \(.user) at \(.ip)"'

Output: User evanusmodestus at 10.50.10.100

Exercise 4.2: Build shell commands

cat /tmp/jq-sessions.json | jq -r '.[] | "ping -c1 \(.ip) # \(.user)"'

Output: Shell commands you could pipe to bash.

Summary: What You Learned

Concept Syntax Example

New object

{key: .field}

{name: .user, addr: .ip}

Shorthand

{field}

\{mac, ip} same as \{mac: .mac, ip: .ip}

New array

[…​]

[.user, .ip] tuple

Collect

[.[] | …​]

[.[] | .ip] all IPs in array

CSV

@csv

[.a, .b] | @csv

TSV

@tsv

[.a, .b] | @tsv

Interpolate

\(expr)

"IP: \(.ip)"

Exercises to Complete

  1. [ ] Create CSV of mac,ip,user for VLAN 10 only

  2. [ ] Build objects with fields: endpoint_mac, endpoint_ip, network_vlan

  3. [ ] Generate arp -s <ip> <mac> commands for each entry

  4. [ ] Create array of all unique VLANs

Next Session

Session 04: Conditions - if/then/else, alternative operator, error handling.

Session Log

Timestamp Notes

Start

<Record when you started>

End

<Record when you finished>