tomnomnom / gron

Make JSON greppable!
MIT License
13.73k stars 325 forks source link

Output format #104

Open muzzol opened 2 years ago

muzzol commented 2 years ago

This is a feature request for output format configuration.

I would like to remove ending ";" from lines and also remove spaces before and after "=" so instead of this:

json.message.chat.id = 7403466;

I got this

json.message.chat.id=7403466

I think this way will be a lot easier to parse results:

cat test.json | grep "json.message.chat.id" | cut -d"=" -f2

instead of

cat test.json | grep "json.message.chat.id" | cut -d"=" -f2 | cut -d" " -f2- | tr -d";"

mnhrdt commented 2 years ago

Closely related, there could be an option also for removing the useless lines ending with "= {};" and "= [];". That would make it even more grepable!

RossPatterson commented 2 years ago

I would like to remove ending ";" from lines and also remove spaces before and after "=" so instead of this: ... cat test.json | grep "json.message.chat.id" | cut -d"=" -f2

If you're going to pipe the output anyway, why not just run it through sed -e "s/ = /=/" -e "s/;$//" to get the format you like?

RossPatterson commented 2 years ago

Closely related, there could be an option also for removing the useless lines ending with "= {};" and "= [];". That would make it even more grepable!

They're not useless. They may the output correct JSON.

mnhrdt commented 2 years ago

They're not useless. They may the output correct JSON.

Sure, but sometimes you don't care about that. The same option could remove the semicolons, these "empty" lines, and even the equal signs altogether (so that the output is, from the unix point of view, just two columns of NAME VALUE pairs). As @muzzol , often I also spend a lot of sed and awk just to remove this clutter before processing it further.

If this option is easy to add, it would be nice to have.

gibson042 commented 1 year ago

Piling on, it would be nice to have a mode with guaranteed consistency for how keys are represented. That is, quoting all of them rather than on those that are not identifiers.

 json = {};
-json.Host = "headers.jsontest.com";
+json["Host"] = "headers.jsontest.com";
 json["User-Agent"] = "gron/0.1";
 json["X-Cloud-Trace-Context"] = "6917a823919477919dbc1523584ba25d/11970839830843610056";
mnhrdt commented 1 year ago

quoting all of them

But wouldn't this make the output less greppable in general? I'd rather have all keys without quotes, regardless of whether they are identifiers or not.

gibson042 commented 1 year ago

I'd rather have all keys without quotes, regardless of whether they are identifiers or not.

That would violate "The output of gron is valid JavaScript", see https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#prod-MemberExpression and https://tc39.es/ecma262/multipage/ecmascript-language-lexical-grammar.html#sec-identifier-names-static-semantics-early-errors .

mnhrdt commented 1 year ago

That would violate "The output of gron is valid JavaScript"

Sure, and because of this reason the simplified output should not be the default behavior of gron. Still, there may be some value in providing a "super-greppable" uncluttered output for when you don't care that the output is valid javascript (e.g., inside a shell pipeline). For example, I'd like to have an output that looks just like this :

Host headers.jsontest.com
User-Agent gron/0.1
X-Cloud-Trace-Context 6917a823919477919dbc1523584ba25d/11970839830843610056

that is, a text file with two columns that can be directly processed by the standard unix utilities.

muzzol commented 1 year ago

Sure, and because of this reason the simplified output should not be the default behavior of gron. Still, there may be some value in providing a "super-greppable" uncluttered output for when you don't care that the output is valid javascript

exactly this. creating simple bash scripts is one of the reasons I choose this tool, it's not really important if origin is a regulated standard or just a line of text.

muzzol commented 1 year ago

just to give some context, here's the help for smbclient utility:

smbclient --help
Usage: smbclient service <password>
  -R, --name-resolve=NAME-RESOLVE-ORDER     Use these name resolution services only
  -M, --message=HOST                        Send message
  -I, --ip-address=IP                       Use this IP to connect to
  -E, --stderr                              Write messages to stderr instead of stdout
  -L, --list=HOST                           Get a list of shares available on a host
  -m, --max-protocol=LEVEL                  Set the max protocol level
  -T, --tar=<c|x>IXFvgbNan                  Command line tar
  -D, --directory=DIR                       Start from directory
  -c, --command=STRING                      Execute semicolon separated commands
  -b, --send-buffer=BYTES                   Changes the transmit/send buffer
  -t, --timeout=SECONDS                     Changes the per-operation timeout
  -p, --port=PORT                           Port to connect to
  -g, --grepable                            Produce grepable output
  -q, --quiet                               Suppress help message
  -B, --browse                              Browse SMB servers using DNS

notice the '-g' option: -g, --grepable Produce grepable output

gibson042 commented 1 year ago

What if a property name includes the delimiter sequence?

mnhrdt commented 1 year ago

What if a property name includes the delimiter sequence?

Then the output would be slightly ambiguous, but still easily grepable.