awk for JSON.
Run make install as root to install jawk to /usr/local/bin.
or
Copy the jawk file to somewhere in your PATH.
$ echo '{"age":10}' | jawk '{print _["age"]}'
10
$ echo '{"person":{"name":"Jason"}}' | jawk '{print _["person","name"]}'
Jason
$ echo '[4,2,0]' | jawk '{while (++i <= _["length"]) print _[i]}'
4
2
0
$ echo '[{"x":6},{"x":7}]' | jawk '{while (++i <= _["length"]) print _[i,"x"]}'
6
7
$ printf '{"x":6}\n{"x":7}\n' | jawk '{print _["x"]}'
6
7
$ echo '{"name":{"first":"Jason"},"age":25}' | jawk '{
keys(o); for (k in o) print k, _[o[k],JSON]
}'
name {"first":"Jason"}
age 25
$ echo '{"name":"Jason"}' | jawk '{print _["name",JSON]}'
"Jason"
# Try it with real data!
curl -Ls https://api.github.com/repos/onetrueawk/awk |
jawk '{print "id:", _["id"], "owner.id:", _["owner","id"]}'
curl -Ls https://api.github.com/repos/onetrueawk/awk/commits |
jawk '{
while (++i <= _["length"]) {
sha = _[i,"sha"]
message = _[i,"commit","message"]
l = index(message, "\n")
print sha, substr(message, 1, l ? l - 1 : 50)
}
}'
curl -Ls https://api.github.com/repos/onetrueawk/awk/commits |
jawk '{while (++i <= _["length"]) printf("{\"sha\":%s}\n",_[i,"sha",JSON])}'jawk makes available each JSON object using the _ variable. jawk programs
are awk programs, and all awk features and functions are available. Nested
fields can be accessed using standard awk indexing (eg. _["foo","bar"]).
Some conversions are done: the value true is converted to 1, false is
converted to 0 and null is converted to "". Arrays are 1-indexed.
Return the value of the object at path p if it's a primitive, or p if it's
an object or array. If the root object is a primitive, _[0] returns its
value.
Return the length of the array at path p, or the root array if p is
omitted.
Return the JSON form of the object at path p, or the root object if p is
omitted.
Return the type of the object at path p, or the root object if p is
omitted. The result will be one of boolean, null, array, object,
string or number.
Populate the array a with the keys of the object at path o such that a[k] = p where k is the key and p is its full path. The path can then be passed
to _ to retrieve its value. If o isn't provided, a is populated with the
keys and paths of the root object. Returns the number of keys.
Make changes to src/jawk.sh and run make to produce jawk. Run make -B test to test changes.