Check out the
jc
Python package documentation for developers
jc
is available as an Ansible filter plugin in thecommunity.general
collection. See this blog post for an example.
JC
JSON Convert
jc
JSONifies the output of many CLI tools, file-types, and common strings
for easier parsing in scripts. See the Parsers section for
supported commands, file-types, and strings.
dig example.com | jc --dig
[{"id":38052,"opcode":"QUERY","status":"NOERROR","flags":["qr","rd","ra"],
"query_num":1,"answer_num":1,"authority_num":0,"additional_num":1,
"opt_pseudosection":{"edns":{"version":0,"flags":[],"udp":4096}},"question":
{"name":"example.com.","class":"IN","type":"A"},"answer":[{"name":
"example.com.","class":"IN","type":"A","ttl":39049,"data":"93.184.216.34"}],
"query_time":49,"server":"2600:1700:bab0:d40::1#53(2600:1700:bab0:d40::1)",
"when":"Fri Apr 16 16:09:00 PDT 2021","rcvd":56,"when_epoch":1618614540,
"when_epoch_utc":null}]
This allows further command-line processing of output with tools like jq
or jello
by piping commands:
$ dig example.com | jc --dig | jq -r '.[].answer[].data'
93.184.216.34
or using the alternative "magic" syntax:
$ jc dig example.com | jq -r '.[].answer[].data'
93.184.216.34
jc
can also be used as a python library. In this case the returned value
will be a python dictionary, a list of dictionaries, or even a
lazy iterable of dictionaries
instead of JSON:
>>> import subprocess
>>> import jc
>>>
>>> cmd_output = subprocess.check_output(['dig', 'example.com'], text=True)
>>> data = jc.parse('dig', cmd_output)
>>>
>>> data[0]['answer']
[{'name': 'example.com.', 'class': 'IN', 'type': 'A', 'ttl': 29658, 'data':
'93.184.216.34'}]
For
jc
Python package documentation, usehelp('jc')
,help('jc.lib')
, or see the online documentation.
Two representations of the data are available. The default representation uses a
strict schema per parser and converts known numbers to int/float JSON values.
Certain known values of None
are converted to JSON null
, known boolean
values are converted, and, in some cases, additional semantic context fields are
added.
To access the raw, pre-processed JSON, use the -r
cli option or the raw=True
function parameter in parse()
when using jc
as a python library.
Schemas for each parser can be found at the documentation link beside each Parser below.
Release notes can be found in the Releases section on Github.
Why Would Anyone Do This!?
For more information on the motivations for this project, please see my blog post on Bringing the Unix Philosophy to the 21st Century and my interview with Console.
See also:
- libxo on FreeBSD
- powershell
- blog: linux apps should have a json flag
- Hacker News discussion
- Reddit discussion
Use Cases:
- Bash scripting
- Ansible command output parsing
- Saltstack command output parsing
- Nornir command output parsing
- FortiSOAR command output parsing
Installation
There are several ways to get jc
. You can install via pip
, OS package
repositories, or by downloading the
correct binary for your
architecture and running it anywhere on your filesystem.
Pip (macOS, linux, unix, Windows)
pip3 install jc
OS Package Repositories
OS | Command |
---|---|
Debian/Ubuntu linux | apt-get install jc |
Fedora linux | dnf install jc |
openSUSE linux | zypper install jc |
Arch linux | pacman -S jc |
NixOS linux | nix-env -iA nixpkgs.jc or nix-env -iA nixos.jc |
Guix System linux | guix install jc |
Gentoo Linux | emerge dev-python/jc |
Photon linux | tdnf install jc |
macOS | brew install jc |
FreeBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Ansible filter plugin | ansible-galaxy collection install community.general |
FortiSOAR connector | Install from FortiSOAR Connector Marketplace |
For more OS Packages, see https://repology.org/project/jc/versions.
Binaries
For precompiled binaries, see Releases on Github.
Usage
jc
accepts piped input from STDIN
and outputs a JSON representation of the
previous command's output to STDOUT
.
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
Alternatively, the "magic" syntax can be used by prepending jc
to the command
to be converted or in front of the absolute path for Proc files. Options can be
passed to jc
immediately before the command or Proc file path is given.
(Note: command aliases and shell builtins are not supported)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/<path-to-procfile>
The JSON output can be compact (default) or pretty formatted with the -p
option.
Parsers
Argument | Command or Filetype | Documentation |
---|---|---|
--acpi | acpi command parser | details |
--airport | airport -I command parser | details |
--airport-s | airport -s command parser | details |
--apt-cache-show | apt-cache show command parser | details |
--apt-get-sqq | apt-get -sqq command parser | details |
--arp | arp command parser | details |
--asciitable | ASCII and Unicode table parser | details |
--asciitable-m | multi-line ASCII and Unicode table parser | details |
--blkid | blkid command parser | details |
--bluetoothctl | bluetoothctl command parser | details |
--cbt | cbt (Google Bigtable) command parser | details |
--cef | CEF string parser | details |
--cef-s | CEF string streaming parser | details |
--certbot | certbot command parser | details |
--chage | chage --list command parser | details |
--cksum | cksum and sum command parser | details |
--clf | Common and Combined Log Format file parser | details |
--clf-s | Common and Combined Log Format file streaming parser | details |
--crontab | crontab command and file parser | details |
--crontab-u | crontab file parser with user support | details |
--csv | CSV file parser | details |
--csv-s | CSV file streaming parser | details |
--curl-head | curl --head command parser | details |
--date | date command parser | details |
--datetime-iso | ISO 8601 Datetime string parser | details |
--debconf-show | debconf-show command parser | details |
--df | df command parser | details |
--dig | dig command parser | details |
--dir | dir command parser | details |
--dmidecode | dmidecode command parser | details |
--dpkg-l | dpkg -l command parser | details |
--du | du command parser | details |
--efibootmgr | efibootmgr command parser | details |
--email-address | Email Address string parser | details |
--env | env command parser | details |
--ethtool | ethtool command parser | details |
--file | file command parser | details |
--find | find command parser | details |
--findmnt | findmnt command parser | details |
--finger | finger command parser | details |
--free | free command parser | details |
--fstab | /etc/fstab file parser | details |
--git-log | git log command parser | details |
--git-log-s | git log command streaming parser | details |
--git-ls-remote | git ls-remote command parser | details |
--gpg | gpg --with-colons command parser | details |
--group | /etc/group file parser | details |
--gshadow | /etc/gshadow file parser | details |
--hash | hash command parser | details |
--hashsum | hashsum command parser (md5sum , shasum , etc.) | details |
--hciconfig | hciconfig command parser | details |
--history | history command parser |