rubo77
rubo77

Reputation: 20895

Read a json file with bash

I kwould like to read the json file from http://freifunk.in-kiel.de/alfred.json in bash and separate it into files named by hostname of each element in that json string.

How do I read json with bash?

Upvotes: 0

Views: 4406

Answers (3)

pmod
pmod

Reputation: 11007

You can use python one-liner in similar way like (I haven't checked):

curl -s http://freifunk.in-kiel.de/alfred.json | python -c '
import json, sys
tbl=json.load(sys.stdin)
for t in tbl:
  with open(tbl[t]["hostname"], "wb") as fp:
    json.dump(tbl[t], fp)
'

Upvotes: 1

Charles Duffy
Charles Duffy

Reputation: 296049

The easiest way to do this is with two instances of jq -- one listing hostnames, and another (inside the loop) extracting individual entries.

This is, alas, a bit inefficient (since it means rereading the file from the top for each record to extract).

while read -r hostname; do
  [[ $hostname = */* ]] && continue # paranoia; see comments
  jq --arg hostname "$hostname" \
     '.[] | select(.hostname == $hostname)' <alfred.json >"out-${hostname}.json"
done < <(jq -r '.[] | .hostname' <alfred.json)

(The out- prefix prevents alfred.json from being overwritten if it includes an entry for a host named alfred).

Upvotes: 2

konsolebox
konsolebox

Reputation: 75628

How do I read json with bash?

You can use jq for that. First thing you have to do is extract the list of hostnames and save it to a bash array. Running a loop on that array you would then run again a query for each hostname to extract each element based on them and save the data through redirection with the filename based on them as well.

Upvotes: 4

Related Questions