8 ms·
JC – JSONifies the output of many CLI tools
- deafpolygon 4y agoBringing a powershell feature to the Unix CLI.
- Kipters 4y agoSince it's now cross platform, technically powershell brought powershell features to Unix first
- visarga 4y agolove it, json could be the best way to pipe data between processes because it is text, but structured
- drunkpotato 4y agoSo is xml. Json is relatively unstructured compared to other formats. I think json has several advantages though. It’s a relatively lightweight and widely known serialization standard, rich enough for most cases and extensible in others, and it has easy to use parsers in all major programming languages. Also jsonlines is a simple addition that make it easy for json to play well with non-json aware older Unix tools. It has a few shortcomings but I think its advantages outweigh them, and it’s become a pretty widely used standard in a short time.
- tgv 4y agoI just learned about gron (elsewhere in the comment section: https://news.ycombinator.com/item?id=33448471 https://news.ycombinator.com/item?id=33448471). That overcomes some of jsonlines problems.
- menjaprunes 4y agoI stumbled upon this few weeks ago to parse the output of nmcli and now it is in my toolset for scripting I love it
- pgl 4y agoCommand line output as JSON. Very handy and has parsers for tons of common utilities, written in Python. Blog post with examples here: https://blog.kellybrazil.com/2020/08/30/parsing-command-output-in-ansible-with-jc/ https://blog.kellybrazil.com/2020/08/30/parsing-command-outp...
- enriquto 4y agoIn the opposite direction, if you want to recover a human-editable text stream from json data, you run gron.
- ducktective 4y agoThen pipe it into jq [1] to query parameters or build up a formatted string. Or pipe it into rq [2] to convert the format to yaml, toml etc. [1]: https://stedolan.github.io/jq/tutorial/ https://stedolan.github.io/jq/tutorial/ [2]: https://github.com/dflemstr/rq#format-support-status https://github.com/dflemstr/rq#format-support-status
- asicsp 4y agoThere's also https://github.com/TomWright/dasel https://github.com/TomWright/dasel (supports JSON, TOML, YAML, XML and CSV)
- samuell 4y agoI would wish for jq to be a really generic tool for working with structured data on the commandline, but I have a really hard time figuring out how to do e.g. conditional-based editing etc. Can't get my head around that, and don't find any info about it on the net. Seems even something that just supports SQL (upon JSON) would be better in this regard.
- ddulaney 4y agoWhat do you mean by conditional-based editing? I've found its language to be pretty concise and readable, especially with the // operator.
- samuell 4y agoDoing editing only on selected "rows" or items in a structure, based on the values of other attributes in them. Similar to what you specify in the WHERE clause in SQL-statements.
- kbrazil 4y agoHi there - I'm the author of `jc`. I also created `jello`[0], which works just like `jq` but uses python syntax. I find `jq` is great for many things but sometimes more complex operations are easier for me to grok in python. [0] https://github.com/kellyjonbrazil/jello https://github.com/kellyjonbrazil/jello
- uvesten 4y agoAs someone who uses `jq` almost daily, this looks like a great tool I didn’t know I needed. Thanks for the tip!
- nixcraft 4y agoLast year I looked for JSON output with the dig command on Linux but found the yaml option while reading the man page. It was handy. I always wondered why yaml/JSON output is not standard with Linux and Unix utilities for scripting needs. Anyway: dig +yaml google.com
- vidarh 4y agoBecause neither yaml or JSON existed when most of these tools were written, and then people got used to the current outputs, and so it's very varying whether or not anyone has felt the pain enough to decide it's worth adding the option for another output format.
- esskay 4y agoBeen using this a while to pull out a bunch of server stats for a monitoring dashboard and it's been great. I just wish there were more supported services. The total mess of different outputs and config types for Linux packages is extremely annoying to deal with.
- spinningslate 4y agoDidn't know about this, the HN dividend pays out again! When wrestling with sed/awk in trying to parse results of a shell command, I've often thought that a shell-standard, structured outpout would be very handy. Powershell[0] has this, but it's a binary format - so not human-readable. I want something in the middle: human- and machine-readable. Without either having to do parsing gymnastics. jc isn't quite that shell standard, but looks like it goes a long way towards it. And, of course, when JSON falls out of fashion and is replaced by <whatever>, `*c` can emerge to fill the gap. Nice. [0]: https://learn.microsoft.com/en-us/powershell/ https://learn.microsoft.com/en-us/powershell/
- vbezhenar 4y agoShell would benefit from Content-Type/Accept headers. Like you can specify that cat accepts text and jq accepts Json. Then `ip a` would output corresponding type automatically.
- mprovost 4y agoSomeone on this site suggested that programs open another filehandle along with stdout and stderr (stdjson) for their json output which struck me as a way to make this work in a backwards-compatible fashion.
- dotancohen 4y agoEven just a generic stdmeta would go a long way to defining _what_ is being output. Curl is the worst about this. https://unix.stackexchange.com/questions/197809/propose-additional-file-descriptor-stdmeta https://unix.stackexchange.com/questions/197809/propose-addi...
- thesuperbigfrog 4y ago>> Shell would benefit from Content-Type/Accept headers. Like you can specify that cat accepts text and jq accepts Json. Then `ip a` would output corresponding type automatically. That seems unnecessary. Traditionally, shells have always used text streams. JSON is just text that follows a given convention. Couldn't what you are describing be implemented by setting environment variables or using command line flags? For example: PREFERRED_OUTPUT_FORMAT="JSON" --output-format="JSON" --input-format="JSON" Tools that can generate and consume structured text formats are a good idea, but they should be flexible enough that they can even work with other tools that have not been written yet. "This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface." --Doug McIlroy
- asicsp 4y agoSee also: * "Bringing the Unix philosophy to the 21st century (2019)" (https://blog.kellybrazil.com/2019/11/26/bringing-the-unix-philosophy-to-the-21st-century/ https://blog.kellybrazil.com/2019/11/26/bringing-the-unix-ph...) - https://news.ycombinator.com/item?id=28266193 https://news.ycombinator.com/item?id=28266193 238 points | Aug 22, 2021 | 146 comments * "Tips on adding JSON output to your CLI app" (https://blog.kellybrazil.com/2021/12/03/tips-on-adding-json-output-to-your-cli-app/ https://blog.kellybrazil.com/2021/12/03/tips-on-adding-json-...) - https://news.ycombinator.com/item?id=29435786 https://news.ycombinator.com/item?id=29435786 183 points | 11 months ago | 110 comments
- dotancohen 4y agoIf you're bringing that up, then this is the place to spread the word about my dream of a stdmeta file descriptor. https://unix.stackexchange.com/questions/197809/propose-additional-file-descriptor-stdmeta https://unix.stackexchange.com/questions/197809/propose-addi... Just like we have stdout and stderr, header lines such as those produced by `ps` should be printed to stdmeta. Curl is the worse offender here, outputing meta lines to stderr instead of stdout. A stdmeta file descriptor would make it clear what is data, what is an error, and what is _describing_ the data.
- anonymoushn 4y agoIf we're adding standard output fds, maybe it would be a useful time to define any mechanism for consumers of those fds to discern the total ordering of bytes written to the three of them.
- dotancohen 4y agoWC has a "character" flag that really just counts bytes: $ echo דותן | wc -c 9 Note that each letter is two bytes, and the newline is an additional byte. So you could pipe (or tree) to wc to count bytes. For a hypothetical stdmeta on fd 3, that might look like this (piping stdout to devnull): $ foo 3>&1 > /dev/null | wc -c
- rob74 4y agoGreat idea, but sounds like a maintenance nightmare to me. Not only that many users will complain that their favorite CLI tool isn't supported, but also a new release of any of the supported CLI tools might break the support without any kind of warning, as I don't think changes to the (human-readable) output are considered major changes.
- vidarh 4y agoChanges to the human-readable output of most standard Unix tools are a big deal given the amount of scripts which depends on them. They commonly are seen as fairly stable to the point that even some non-Posix tools like e.g. apt, which doesn't have a stable CLI warns about it to stderr if you try to redirect it's output to a pipe[1]. If anything, though, that's a good reason for a tool like this to exist rather than have every script that depends on these tools use their own, often hacky, parsing of the output. [1] "WARNING: apt does not have a stable CLI interface. Use with caution in scripts."
- slightwinder 4y agoIt doesn't even need a new release. jc can already fail because of details like the system-language. With my local language, on a simple output of ls -l, it's parsing {"filename":"drwxr-xr-x 16 root root 4096 Oct 4 11:21 ."} instead of {"filename":".","flags":"drwxr-xr-x","links":16,"owner":"root","group":"root","size":4096,"date":"Oct 4 11:21"} with LANG=US. This makes it really hard to trust such a tool.
- simonkagedal 4y agoThis is true. However, the issue is with the tool outputting unstructured data to begin with. As the `jc` author says, the best would be if tools supported structured output formats to begin with. Any custom parser of ls output would potentially have the same problem. Of course, it can be improved though – for example by looking at LANG – and it would be nice for such improvements to get into `jc`, so that other tools can rely on it at least more than doing the parsing directly themselves.
- kbrazil 4y ago
- vesinisa 4y agoSeems to be part of the Arch repository: https://archlinux.org/packages/community/any/jc/ https://archlinux.org/packages/community/any/jc/ Why does this site recommend using "paru", "aura" or "yay" to install it on Arch? I have been using Arch for a decade or so but have never even heard of such tools. They don't even have pages in the Arch wiki, and only yay ("Pacman wrapper and AUR helper written in go") is available via the standard repository. Begs the question: what is so wrong with plain pacman? EDIT: Okay so seems they were previously on AUR and once accepted to community repository they just forgot to stop recommending an AUR wrapper for installing: https://github.com/kellyjonbrazil/jc/commit/f2dd7b8815edc92e0b7c06367b2de11616938980 https://github.com/kellyjonbrazil/jc/commit/f2dd7b8815edc92e... EDIT2: Created a PR with the GitHub.dev editor .. Absolutely blown away by how easy it was! Feels like the future of development.. https://github.com/kellyjonbrazil/jc/pull/310 https://github.com/kellyjonbrazil/jc/pull/310
- tazjin 4y agoIt's a program to wrap stable CLI programs, makes sense that they recommend a wrapper around a stable program like pacman
- kangalioo 4y agoIs this a snarky comment implying that the CLI programs and pacman are better left unwrapped?
- bennyp101 4y agoLooking at github, it was only moved from AUR in May this year, but the commit only changed the description, not the commands. But this is 100% going in my toolbox - I can think of a couple of scripts that I can update to use this right of the bat!
- deleted 4y ago[deleted]
- mg 4y agodig example.com | jc --dig Seems a bit redundant. Maybe it should be the other way round? jc dig example.com Similar to how you do time dig example.com
- chii 4y ago`time` needs to be the one to exec the command because they need to know when the command they are timing starts. Therefore, `time` cannot use pipes, as by then, the command being timed would've already started! `jc` doesn't need to know anything about the command producing the output - just the format of the output. So using a pipe and stdin makes a lot of sense.
- DougBTX 4y agoYes, that works, there are examples on the page like: $ jc dig example.com | jq -r '.[].answer[].data' 93.184.216.34 It uses the first argument to infer the command output type.
- berkes 4y agoIs "redundancy" that you have to provide --dig? I can imagine `jc` having some detection built in, from which it determines the command/content it's being parsed. Doesn't seem to have it, yet, and I'm generally no big fan of "magic" like this, but it would remove the redundancy. Having it as a pipe, allows for much more, though. some_expensive_command > out.log jc --expensive-cmd < out.log Or hourly_dig.sh > example_com_records_$(date +%F+%s) cat example_com_records_* | jc --dig
- kbrazil 4y agoHi there - author of `jc` here. I originally intended to have auto-detection but put that on the backburner to focus on creating parsers, especially after introducing the magic syntax. I did implement auto-detection for `/proc` file parsers so you can just do: $ cat /proc/foo | jc --proc or $ jc /proc/foo But you can specify each procfile parser directly if you want to as well.
- friendzis 4y agoSounds a lot like Powershell, which returns rich objects instead of a text blob
- WorldMaker 4y agoYup, powershell is mentioned in the references. Also, this tool can be used to bridge older unix commands into powershell objects (ConvertFrom-Json).
- sindoc 4y agoOMG, I was looking for exactly something like this. I’d like to create immersion between Logseq and CLI. This can very useful.
- pastage 4y agoI Love using this in streams of data, but there is a lot to be said about the pit falls. Some of them; first you might want to filter with grep first and that leads to missing metadata, second error handling is a good thing but people tend to ignore errors and then not handle them. This is basically what filebeat/logstash from Elastic does, which is a beast at parsing (and impossible to use from command line). The power of plain text pipes is that you do not interpret them and that makes them fast, that is usefull because you handle both 100 bytes, 1MB and 1TB as input. You choose what you parse keeping it simple, fast and usually error free. This tool miss the, fast, simple and human readable part of debugging pipes. Which is fine!
- dmoura 4y agoThis is great! I am the author of SPyQL [1]. Combining JC with SPyQL you can easily query the json output and run python commands on top of it from the command-line :-) You can do aggregations and so forth in a much simpler and intuitive way than with jq. I just wrote a blogpost [2] that illustrates it. It is more focused on CSV, but the commands would be the same if you were working with JSON. [1] https://github.com/dcmoura/spyql https://github.com/dcmoura/spyql [2] https://danielcmoura.com/blog/2022/spyql-cell-towers/ https://danielcmoura.com/blog/2022/spyql-cell-towers/
- sbt567 4y agoWow, this looks super useful. Will definitely check this out. Thanks
- fimdomeio 4y agoThere's a clash of names between this jc and autojump (https://github.com/wting/autojump https://github.com/wting/autojump) jc (jump to child)
- otikik 4y agoThis is a good step in the right direction, which IMHO should be that all those cli tools should have a —-json flag.
- prima-facie 4y agoUnrelated tool but also very useful in combination with JQ: gron https://github.com/tomnomnom/gron https://github.com/tomnomnom/gron
- berkes 4y agoA slightly related pet-peeve: I don't like it when "random" commands "squat" the two-letter domain, or worse, the one-letter domain: t, jq, jc etc. In my perfect world (which, obviously doesn't exist), commands from tools "in the wild" are at least three letters long. With historical exceptions for gnutools: preferably they'd take the three-letter space, but two-letters (cd, ls, rm etc) is fine. Two letter space outside of gnutools, is then reserved for my aliases. If jsonquery is too long to type, AND I lack autocomplete, then an alias is easy and fast to make. alias jq=jsonquery. In the case of this tool, it will conflict with a specialised alias I have: `alias jc=javac -Werror`. Easy to solve by me with another alias, but a practical example of why I dislike tools "squatting" the two letter namespace.
- artemisart 4y agoI don't believe it's really an issue in practice, your `jc` alias will just take the priority and you can easily add one for jsonquery -> `path/to/bin/jc`. I think good short command names can help adoption (like for ripgrep, fd) but it's true that we should have a race to squat all the 2 letter names.
- Sharparam 4y agoInstead of typing the whole path, you can also use `command` or a backslash to bypass aliases E.g.: alias jsonquery='command jq'
- ycombobreaker 4y agoI perceive an element of hubris when a tool claims a two-character name. That is a very small namespace, so the tool is effectively staking a claim on mental or emotional real-estate.
- Too 4y agoGiven this tool is likely to be used in a bunch of bash scripts, collisions with aliases can be a big problem.
- deleted 4y ago[deleted]
- anecdotal1 4y agoCan you trust it? Cli tool output is not exactly stable. I thought that's why libxo exists? https://github.com/Juniper/libxo https://github.com/Juniper/libxo
- gorkish 4y agoAnother vote for something like libXo as the better solution. This thing is just passing the parsing problem of interacting with an unstable API to someone else and hoping they maintain theirs better than you would maintain yours.
- synergy20 4y agoto make this great tool truly universal, it has to be written in c instead of python these days, then provide python|javascript|etc bindings if possible. I'd like to use it on embedded systems, where python is too large to fit. this tool can be widely deployed just like awk|sed|etc but it has to be in C for that.
- makapuf 4y agoAgreed but I would change it with "any compiled language that has no external runtime" and common shared libs dependencies. I don't care that a utility is written in Go, Zig, C++ or Pascal ;)
- kbrazil 4y ago`jc` is available today as a compiled binary with all dependencies self-contained. The binaries and OS package installers are available under the GitHub Releases: https://github.com/kellyjonbrazil/jc/releases https://github.com/kellyjonbrazil/jc/releases This is still python under the hood and not as small of a binary as I would like, but it does work.
- montroser 4y agoI would welcome POSIX shell or at least bash as an alternative to a compiled C/Rust/Go binary. But yeah, for these types of utilities, relying on an external language runtime like Python/Node is pretty rough.
- ElectricalUnion 4y agoBut python is also universal? You can just bundle jc inside https://github.com/jart/cosmopolitan/tree/master/third_party/python https://github.com/jart/cosmopolitan/tree/master/third_party... and it's as universal as it gets.
- bitwize 4y agoReplace C with Rust.
- 4y ago
- codedokode 4y agoI think that JSON is a bad choice here. It is obvious that CLI commands should produce machine-readable output because they are often used in scripts, and accept machine-readable input as well. Using arbitrary text output was a mistake because it is difficult to parse, especially when spaces and non-ASCII characters are present. A good choice would be a format that is easily parsed by programs but still readable by the user. JSON is a bad choice here because it is hard to read. In my opinion, something formatted with pipes, quotes and spaces would be better: eth0: ip: 127.15.34.23 flags: BROADCAST|UNICAST mtu: 1500 name: """"Gigabit" by Network Interfaces Inc.""" Note that the format I have proposed here is machine-readable, somewhat human-readable and somewhat parseable by line-oriented tools like grep. Therefore there might be no need for switches to choose output format. It is also relatively easy to produce without any libraries. Regarding idea to output data in /proc or /sys in JSON format, I think this is wrong as well. This would mean that reading data about multiple processes would require lot of formatting and parsing JSON. Instead or parsing /proc and /sys directly, applications should use libraries distributed with kernel, and reading the data directly should be discouraged. Because currently /proc and /sys are just a kind of undocumented API. Also, I wanted to note that I dislike jq utility. Instead of using JSONPath it uses some proprietary query format that I constantly fail to remember.
- thesuperbigfrog 4y ago>> something formatted with pipes, quotes and spaces would be better How well would this format handle deeply nested structures? It seems like it would require a lot of space characters compared to nesting open and close characters: {} or () or [] How would escaping pipes, quotes, and spaces work to represent those character literals? There are already numerous structured text formats: JSON, XML, S-expressions, YAML, TOML, EDN, and many more. Wouldn't this be yet another format? (https://xkcd.com/927/ https://xkcd.com/927/)
- djedr 4y agoDare I suggest Jevko[0] as yet another alternative? eth0 [ ip [127.15.34.23] flags [[BROADCAST][UNICAST]] mtu [1500] name ["Gigabit" by Network Interfaces Inc.] ] This is one of the things it was designed with in mind. It's even simpler and more flexible than S-expressions. Handles deeply nested structures perfectly well. Has only 3 characters to escape (brackets and the escape character). (I am the author) [0] https://jevko.org/ https://jevko.org/
- khiqxj 4y agoThere are at least 3 ways this can create bugs: - It has to parse output of commands which may or may not be intended to be parsed and may or may not have a predictable format. The only way to overcome this is if this program becomes one of the Big Four "UN*X command output -> data" converters - It casts things to "float/int" - Depending on who made this library, the output itself may not be strict / predictable. Perhaps it will output JSON with two different key names in two different scenarios. And don't forget that any of these issues will still come up even if they are accommodated for, due to versions of programs changing without the author of this tool knowing. But yeah basic things having intrinsic shortcomings is a given, when you're using UN*X. From the nested article: > Had JSON been around when I was born in the 1970’s Ken Thompson and Dennis Ritchie may very well have embraced it as a recommended output format to help programs “do one thing well” in a pipeline. They had S-expressions and plenty more options. They also could have just made a format as you can tell with thousands of ad-hoc trendy new formats like YAML and TOML being spewed out every recent year now that programmers discovered data structures.
- kbrazil 4y agoHi - jc author here. Just a couple points: The casting to int/float is not done unless the underlying values are predictably documented to be numbers. There are rare cases where auto int/float conversions are done, but: 1) This is always documented, and 2) You can turn this functionality off via the —raw flag Also, predictable schemas are documented with each parser. (e.g `jc -h —-arp`)
- jwilk 4y ago> Big Four "UN*X command output -> data" converters What do you mean?
- khiqxj 4y agoI mean that there would be a big 4 such converters if people actually invested time into these "front ends" to CLIs.
- exabrial 4y agoHave a parseable output is great. What would be more incredible is to have a parseable output with a schema definition and/or formal grammar of some sort.
- vincnetas 4y agoSchemas are provided on linked page near definitions of parsers.
- kbrazil 4y agoYou can also run `jc -h --dig` to get the parser details that include the schema. Having true JSON Schema[0] is being considered, but on the back-burner due to the sheer number of parsers to build schemas for. Also, it is more difficult to accurately define the schema for a small subset of parsers since their command output are so variable. [0] https://json-schema.org/ https://json-schema.org/
- UncleEntity 4y ago> What would be more incredible is to have a parseable output with a schema definition and/or formal grammar of some sort. I’ve been trying to build something like this but simply don’t have the free time currently. The plan: adapt the parser VM from lpeg (or similar, there’s a paper I’ve been reading on an Earley parser VM) into a command line app that takes a grammar + text input (or stdin) and spits out json to a file (or stdout). Probably not as general purpose as this one but also wouldn’t need a pull request to add a new format. All the pieces are there but without the free time… I was actually curious if there was any demand for such a thing, I just want it to parse my payroll statements because this billion dollar company can only manage crappy pdfs and, well, it’s an interesting problem. —edit— Oh, output schema. Totally different than what I’m going on about.
- pessimizer 4y agoI don't know why I never considered this sort of option to powershell out bash. My only problem with it is that it's in python (also why I don't really use jq), and that it's not something that just sets aliases behind the scenes. If this were written in a performant language, if it simply aliased (i.e. invisibly) all common cli commands to a wrapper which would obviate the need for all of the text processing between steps in command pipelines, if it were versioned and I could include the version number in scripts, and finally if I could run versioned scripts through it to compile them into standard bash scripts (a big ask), I'd give it a 3 month test starting today. There'd be nothing to lose. Just putting that out there for people who like to rewrite things in Rust. A slightly different version of this concept could allow for nearly friction-free adoption.
- cstrahan 4y ago> also why I don't really use jq) You also don’t like software written in C (the language jq is written in)?
- freedomben 4y agoWhy is the python an issue for you? I also dislike and avoid tools written in python, unless they have an rpm available. If there's a package then I don't so much care what language it's in.
- hinkley 4y agoI discovered process.send() in Node a couple years ago and it made the decision to fork a child process a lot easier. No need to sanitize command line output when you can do direct IPC over a connection that uses JSON under the hood. The itch I can’t seem to scratch is how to run tasks in parallel and have logs that are legible to coworkers. We do JSON formatted logs in production and I’m wondering if something like this would help solve that set of problems.
- HyperSane 4y agoThe greatest thing about powershell is that all commands returns structured output like this.
- WorldMaker 4y agoAlso, this tool is useful for using old unix commands in powershell: `jc … | ConvertFrom-Json` easily gives you powershell objects to work with.
- HyperSane 4y agoThat is a great idea!
- psadri 4y agoIs anyone aware of something similar but for the args? A database that maps a command to a schema for all it’s possible cli arguments?
- naikrovek 4y agoThis seems very fragile, to me, without support from the application whose output is converted to JSON. minor updates to command-line tools can and do subtly alter the textual output of the tool, and the outputs of these tools are not standardized. This is a step towards "objects passing messages" as originally conceived by Alan Kay, if my incomplete understanding of what he's said is correct, and that's a good thing, I think. Objects passing messages around is a very solid model for computing, to me. Note that I am stupid and don't understand much, if I'm honest.
- wodenokoto 4y agoSomething like this is what I've been thinking is the path forward to non-posix shells and a way to get away from cumbersome foot-gunny bash. Nushell that hit the front page earlier this week seemed to me to be limited by "compatible" apps, but wrapping all the big ones in a json converter superficially seems like a great solution to me.
- fabianthomas 4y agoI'm really concerned about performance/latency with the json approach. I couldn't find anyone discussing that yet completely. Even when using jq (written in C) my quick tests show that parsing json is really slow compared to parsing with simple unix tools like awk. I suspect that to come from the fact that the parser has to check the full json output first in order to print a result, while awk does not care about syntax of the output. I compared two shell scripts both printing the ifindex of some network device (that is the integer in the first column) 10 times. Using awk and head combined gives me 0,068s total time measured with the time command. Using ip with the -j flag together with jq gives 0,411s. Therefore the awk approach is 6 times faster. And here I used a binary (ip) that already supports json output and doesn't even need the mentioned jc. While this whole test setup is somewhat arbitrary I experienced similar results in the past when writing shell scripts for, e.g., my panel. Reach out to me if you are interested in my test setup.
- Too 4y agoWhile I can appreciate the immediate value this tool brings for some applications. At the same time it’s an epitome of everything that is wrong with current software landscape. Instead of fixing the deficiencies in upstream, once and for all, we just keep piling more and more layers on top. Programs having structural data and APIs inside, that get translated into human representation - only to be re-parsed again into structural form. What could possibly go wrong? If you are already in any programming environment, many of the tools already have better built in APIs. I mean who needs an “ls” or timestamp parser. Just use os.listdir or equivalent. As someone previously pointed out in this thread, the ls parser is in fact already broken, unsurprisingly. Mixing tools made for interactive use in automation is never a good idea. The Unix philosophy sounds romantic in theory, but need structural data, throughout, to work reliably in practice. Kids, go with the underlying apis unless your tool has structured output.
- garfieldnate 4y agoOne of the features of Julia that I really like and wish would be adopted elsewhere is that the stringification methods take a context object that can indicate the string is to be presented in: plaintext, ansii-colored terminal, json, HTML, LaTeX, GraphViz, etc. It would have been amazing to have this kind of flexibility considered in the Unix tools. That said, I would argue that JSONLines is a better universal output format when you're dealing with pipelines. If the output is one giant JSON array, then you have to wait for a long-running program to finish completely before the output can be passed on to the next long-running program. If you output one JSON line at a time as you process your input, then the next program in the pipeline can get started on processing already without waiting for the first to finish completely.
- kbrazil 4y agoGood news - `jc` supports JSONLines output for many commands and file-types, too!