Earler today I was looking at some deeply nested structures which had leaf nodes with a field named "fileURL", and values that were mostly "https://" but some were "http://". I needed to see how many, etc.
cat file.json | gron | grep fileURL | grep http | grep -v https
... and presto, I had only four such nodes.
Would've been a ton more work to get there with just jq.
<file.json jq '.. | .fileURL? | select(startswith("http://"))' -r
... would've done the job?Or, if you can't remember `startswith`:
<file.json jq '.. | .fileURL?' -r | grep '^http://'Right, the ".." part was hard to remember because it's something like:
{
"entries": [
{
"fields": {
"fileURL": {
"en-US": "https://..."
},
...
},
...
},
...
]
}
and as you can see the field fileURL is actually an object with another field en-US (with a hyphen) so the jq becomes something like this:<file.json jq -r '.entries[] | .fields | select(.fileURL) | .fileURL["en-US"] | select(startswith("http://"))'
And later I had to do the same for other fields that ended in URL (websiteURL, etc.)
Anyway, gron made it simpler to get a quick summary of what I needed because it represents every node in the tree as a separate line that has the path in it, which is perfect for grep.
I still use jq more than gron :-)
You misunderstand. The command I wrote is meant to be used as I wrote it. `..` is not a placeholder for you to replace.
https://stedolan.github.io/jq/manual/#RecursiveDescent%3a%2e...
>and as you can see the field fileURL is actually an object with another field en-US (with a hyphen) so the jq becomes something like this:
Sure, so then it's:
<file.json jq '.. | select(.fileURL?).fileURL["en-US"] | select(startswith("http://"))' -rThanks for explaining!
so a jq utility[] that spits out all the jq paths for a json files helps in both cases.