3 ms·
Agreed, gron is a fantastic tool. Earler today I was looking at some deeply nested structures which had leaf nodes with a field named "fileURL", and values tha
by donut 6y ago
Agreed, gron is a fantastic tool.
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:// https://" but some were "http:// 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.
- Arnavion 6y agoBased on your description, it sounds like: <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://'
- donut 6y agoNice and terse :-) 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:// 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 :-)
- Arnavion 6y ago>Right, the ".." part was hard to remember because it's something like: 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%2e 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://"))' -r
- donut 6y agoOh, I had no idea ".." was an operator. That's a pretty cool feature, combined with the "?" to match optional objects. Thanks for explaining!