Try the
jc
web demo!
I’m happy to announce the release of jc
version 1.13.1 available on github and pypi.
jc
now supports over 55 commands and file-types, including the new ping
, sysctl
, traceroute
, and tracepath
command parsers. The INI file parser has been enhanced to support simple key/value text files and the route
command parser now supports IPv6 tables.
Custom local parser plugins are now supported. This allows overriding existing parsers and rapid development of new parsers.
Other updates include verbose debugging, more consistent handling of empty data, and many parser fixes for FreeBSD.
jc
can be installed via pip
or through several new official OS package repositories, including Fedora, openSUSE, Arch Linux, NixOS Linux, Guix System Linux, FreeBSD, and macOS. For more information on how to get jc
, click here.
To upgrade with pip
:
$ pip3 install --upgrade jc
New Features
jc
is now available on the official Fedora repository (dnf install jc
)jc
is now available on the official Arch Linux repository (pacman -S jc
)jc
is now available on the official NixOS repository (nix-env -iA nixpkgs.jc
)jc
is now available on the official Guix System Linux repository (guix install jc
)jc
is now available on the official FreeBSD ports repository (portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean
)jc
is in process (Intent To Package) for Debian packaging.- Local custom parser plugins allow you to override packaged parsers or rapidly create your own.
- Verbose debugging is now supported with the
-dd
command argument. - All parsers now correctly return empty objects when sent empty data.
- Older versions of the
pygments
library (>=2.3.0) are now supported (for Debian packaging)
New Parsers
jc
now supports 55 parsers. New parsers include ping
, sysctl
, tracepath
, and traceroute
.
Documentation and schemas for all parsers can be found here.
ping
command parser
Linux, macOS, and FreeBSD support for the ping
command:
$ ping 8.8.8.8 -c 3 | jc --ping -p # or: jc -p ping 8.8.8.8 -c 3 { "destination_ip": "8.8.8.8", "data_bytes": 56, "pattern": null, "destination": "8.8.8.8", "packets_transmitted": 3, "packets_received": 3, "packet_loss_percent": 0.0, "duplicates": 0, "time_ms": 2005.0, "round_trip_ms_min": 23.835, "round_trip_ms_avg": 30.46, "round_trip_ms_max": 34.838, "round_trip_ms_stddev": 4.766, "responses": [ { "type": "reply", "timestamp": null, "bytes": 64, "response_ip": "8.8.8.8", "icmp_seq": 1, "ttl": 118, "time_ms": 23.8, "duplicate": false }, { "type": "reply", "timestamp": null, "bytes": 64, "response_ip": "8.8.8.8", "icmp_seq": 2, "ttl": 118, "time_ms": 34.8, "duplicate": false }, { "type": "reply", "timestamp": null, "bytes": 64, "response_ip": "8.8.8.8", "icmp_seq": 3, "ttl": 118, "time_ms": 32.7, "duplicate": false } ] }
sysctl
command parser
Linux, macOS, and FreeBSD support for the sysctl -a
command:
$ sysctl -a | jc --sysctl -p # or: jc -p sysctl -a { "user.cs_path": "/usr/bin:/bin:/usr/sbin:/sbin", "user.bc_base_max": 99, "user.bc_dim_max": 2048, "user.bc_scale_max": 99, "user.bc_string_max": 1000, "user.coll_weights_max": 2, "user.expr_nest_max": 32 ... }
tracepath
command parser
Linux support for the tracepath
command:
$ tracepath6 3ffe:2400:0:109::2 | jc --tracepath -p { "pmtu": 1480, "forward_hops": 2, "return_hops": 2, "hops": [ { "ttl": 1, "guess": true, "host": "[LOCALHOST]", "reply_ms": null, "pmtu": 1500, "asymmetric_difference": null, "reached": false }, { "ttl": 1, "guess": false, "host": "dust.inr.ac.ru", "reply_ms": 0.411, "pmtu": null, "asymmetric_difference": null, "reached": false }, { "ttl": 2, "guess": false, "host": "dust.inr.ac.ru", "reply_ms": 0.39, "pmtu": 1480, "asymmetric_difference": 1, "reached": false }, { "ttl": 2, "guess": false, "host": "3ffe:2400:0:109::2", "reply_ms": 463.514, "pmtu": null, "asymmetric_difference": null, "reached": true } ] }
traceroute
command parser
Linux, macOS, and FreeBSD support for the traceroute
command:
$ traceroute -m 3 8.8.8.8 | jc --traceroute -p # or: jc -p traceroute -m 3 8.8.8.8 { "destination_ip": "8.8.8.8", "destination_name": "8.8.8.8", "hops": [ { "hop": 1, "probes": [ { "annotation": null, "asn": null, "ip": "192.168.1.254", "name": "dsldevice.local.net", "rtt": 6.616 }, { "annotation": null, "asn": null, "ip": "192.168.1.254", "name": "dsldevice.local.net", "rtt": 6.413 }, { "annotation": null, "asn": null, "ip": "192.168.1.254", "name": "dsldevice.local.net", "rtt": 6.308 } ] }, { "hop": 2, "probes": [ { "annotation": null, "asn": null, "ip": "76.220.24.1", "name": "76-220-24-1.lightspeed.sntcca.sbcglobal.net", "rtt": 29.367 }, { "annotation": null, "asn": null, "ip": "76.220.24.1", "name": "76-220-24-1.lightspeed.sntcca.sbcglobal.net", "rtt": 40.197 }, { "annotation": null, "asn": null, "ip": "76.220.24.1", "name": "76-220-24-1.lightspeed.sntcca.sbcglobal.net", "rtt": 29.162 } ] }, { "hop": 3, "probes": [ { "annotation": null, "asn": null, "ip": null, "name": null, "rtt": null } ] } ] }
Updated Parsers
There have been many parser updates since v1.11.0. The INI file parser has been enhanced to support files and output that contains simple key/value pairs. The route
command parser has been enhanced to add support for IPv6 routing tables. The uname
parser provides more intuitive debug messages and an issue in the iptables
command parser was fixed, allowing it to convert the last row of a table. Many other parser enhancements including the consistent handling of blank input, FreeBSD support, and minor field additions and fixes are included.
Key/Value Pair Files with the INI File Parser
The INI file parser has been enhanced to now support files containing simple key/value pairs. Files can include comments prepended with #
or ;
and keys and values can be delimited by =
or :
with or without spaces. Quotation marks are stripped from quoted values, though they can be kept with the -r
(raw output) jc
argument.
These types of files can be found in many places, including configuration files in /etc
. (e.g. /etc/sysconfig/network-scripts
).
$ cat keyvalue.txt # this file contains key/value pairs name = John Doe address=555 California Drive age: 34 ; comments can include # or ; # delimiter can be = or : # quoted values have quotation marks stripped by default # but can be preserved with the -r argument occupation:"Engineer" $ cat keyvalue.txt | jc --ini -p { "name": "John Doe", "address": "555 California Drive", "age": "34", "occupation": "Engineer" }
route
Command Parser
The route
command parser has been enhanced to support IPv6 tables.
$ route -6 | jc --route -p # or: jc -p route -6 [ { "destination": "[::]/96", "next_hop": "[::]", "flags": "!n", "metric": 1024, "ref": 0, "use": 0, "iface": "lo", "flags_pretty": [ "REJECT" ] }, { "destination": "0.0.0.0/96", "next_hop": "[::]", "flags": "!n", "metric": 1024, "ref": 0, "use": 0, "iface": "lo", "flags_pretty": [ "REJECT" ] }, { "destination": "2002:a00::/24", "next_hop": "[::]", "flags": "!n", "metric": 1024, "ref": 0, "use": 0, "iface": "lo", "flags_pretty": [ "REJECT" ] }, ... ]
Schema Changes
There are no schema changes in this release.
Full Parser List
airport -I
airport -s
arp
blkid
crontab
crontab-u
CSV
df
dig
dmidecode
du
env
file
free
fstab
/etc/group
/etc/gshadow
history
/etc/hosts
id
ifconfig
INI
iptables
jobs
last
andlastb
ls
lsblk
lsmod
lsof
mount
netstat
ntpq
/etc/passwd
ping
pip list
pip show
ps
route
/etc/shadow
ss
stat
sysctl
systemctl
systemctl list-jobs
systemctl list-sockets
systemctl list-unit-files
timedatectl
tracepath
traceroute
uname -a
uptime
w
who
XML
YAML
For more information on the motivations for creating
jc
, see my blog post.
Happy parsing!