I’m excited to announce the release of jc version 1.22.0 available on github and pypi. jc now supports over 170 standard and streaming parsers. Thank you to the Open Source community for making this possible!
jc can be installed via pip or through several official OS package repositories, including Debian, Ubuntu, Fedora, openSUSE, Arch Linux, NixOS Linux, Guix System Linux, FreeBSD, and macOS. For more information on how to get jc, see the project README.
To upgrade with pip:
$ pip3 install --upgrade jc
Try the
jcweb demo!
What’s New
- Add
/procfile parsers for linux. Support for the following files:/proc/buddyinfo/proc/consoles/proc/cpuinfo/proc/crypto/proc/devices/proc/diskstats/proc/filesystems/proc/interrupts/proc/iomem/proc/ioports/proc/loadavg/proc/locks/proc/meminfo/proc/modules/proc/mtrr/proc/pagetypeinfo/proc/partitions/proc/slabinfo/proc/softirqs/proc/stat/proc/swaps/proc/uptime/proc/version/proc/vmallocinfo/proc/vmstat/proc/zoneinfo/proc/driver/rtc/proc/net/arp/proc/net/dev/proc/net/dev_mcast/proc/net/if_inet6/proc/net/igmp/proc/net/igmp6/proc/net/ipv6_route/proc/net/netlink/proc/net/netstat/proc/net/packet/proc/net/protocols/proc/net/route/proc/net/unix/proc/<pid>/fdinfo/<fd>/proc/<pid>/io/proc/<pid>/maps/proc/<pid>/mountinfo/proc/<pid>/numa_maps/proc/<pid>/smaps/proc/<pid>/stat/proc/<pid>/statm/proc/<pid>/status - Magic syntax support for
/procfiles - Enhance bash and zsh autocompletions for
/procfiles, including the Magic syntax - Enhance metadata output to output metadata even when results are empty
- Enhance
freeparser to support-woption integer conversions - Fix
iniandkvparsers so they don’t change key-names to lower case
NOTE: This can be a breaking change in your scripts - Fix
idcommand parser to allow usernames and group names with spaces
New Features
Metadata Enhancement
The --meta-out option was introduced in jc version 1.21.0. This feature has been enhanced to ensure metadata is always output – even if there are no results. for example, when running arp on macOS without the required -a flag:
% jc --meta-out --pretty arp
usage: arp [-n] [-i interface] hostname
arp [-n] [-i interface] [-l] -a
arp -d hostname [pub] [ifscope interface]
arp -d [-i interface] -a
arp -s hostname ether_addr [temp] [reject] [blackhole] [pub [only]] [ifscope interface]
arp -S hostname ether_addr [temp] [reject] [blackhole] [pub [only]] [ifscope interface]
arp -f filename
[
{
"_jc_meta": {
"parser": "arp",
"timestamp": 1664302590.903263,
"magic_command": [
"arp"
],
"magic_command_exit": 1
}
}
]
New Parsers
/proc File Parsers
Many new /proc file parsers have been added and more will be released in future versions of jc. The easiest way to use these parsers is by invoking the --proc parser. The --proc parser (Documentation) will analyze the input data and select the correct /proc parser automatically:
% cat /proc/uptime | jc --proc -p
{
"up_time": 46901.13,
"idle_time": 46856.66
}
It is possible to manually select the /proc file parser by designating the specific parser. For example:
% cat /proc/uptime | jc --proc-uptime -p
{
"up_time": 46901.13,
"idle_time": 46856.66
}
Finally, you can also use the Magic syntax to convert /proc files:
% jc -p /proc/uptime
{
"up_time": 46901.13,
"idle_time": 46856.66
}
The bash and zsh autocompletion scripts have been updated to allow autocompletion of all of the new /proc file parsers and the /proc file magic syntax.
Individual /proc file parsers are hidden from jc --help. To find the low-level parser names, you can use jc -hh or jc --about:
% jc -hh
jc converts the output of many commands, file-types, and strings to JSON or YAML
Usage:
Standard syntax:
COMMAND | jc [OPTIONS] PARSER
cat FILE | jc [OPTIONS] PARSER
echo STRING | jc [OPTIONS] PARSER
Magic syntax:
jc [OPTIONS] COMMAND
jc [OPTIONS] /proc/<path-to-procfile>
Parsers:
<snip>
--ping `ping` and `ping6` command parser
--ping-s `ping` and `ping6` command streaming parser
--pip-list `pip list` command parser
--pip-show `pip show` command parser
--plist PLIST file parser
--postconf `postconf -M` command parser
--proc `/proc/` file parser
--proc-buddyinfo `/proc/buddyinfo` file parser
--proc-consoles `/proc/consoles` file parser
--proc-cpuinfo `/proc/cpuinfo` file parser
--proc-crypto `/proc/crypto` file parser
--proc-devices `/proc/devices` file parser
--proc-diskstats `/proc/diskstats` file parser
--proc-filesystems `/proc/filesystems` file parser
--proc-interrupts `/proc/interrupts` file parser
--proc-iomem `/proc/iomem` file parser
<snip>
Options:
-a, --about about jc
-C, --force-color force color output even when using pipes (overrides -m)
-d, --debug debug (double for verbose debug)
-h, --help help (--help --parser_name for parser documentation)
-m, --monochrome monochrome output
-M, --meta-out add metadata to output including timestamp, etc.
-p, --pretty pretty print output
-q, --quiet suppress warnings (double to ignore streaming errors)
-r, --raw raw output
-u, --unbuffer unbuffer output
-v, --version version info
-y, --yaml-out YAML output
-B, --bash-comp gen Bash completion: jc -B > /etc/bash_completion.d/jc
-Z, --zsh-comp gen Zsh completion: jc -Z > "${fpath[1]}/_jc"
Examples:
Standard Syntax:
$ dig www.google.com | jc --pretty --dig
$ cat /proc/meminfo | jc --pretty --proc
Magic Syntax:
$ jc --pretty dig www.google.com
$ jc --pretty /proc/meminfo
Parser Documentation:
$ jc --help --dig
Show Hidden Parsers:
$ jc -hh
You can find the schema for each /proc parser with the same help syntax:
% jc --help --proc-uptime
v1.22.1 Updates
- Add
udevadmcommand parser - Add
lspcicommand parser - Add
pci.idsfile parser - Fix
proc-pid-statparser for command names with spaces and newlines - Enhance
ip-addressparser to addip_splitfield - Rename
iso-datetimeparser todatetime-iso. A deprecation warning will display untiliso-datetimeis removed in a future version. - Optimize performance of calculated timestamps
- Add support for deprecating parsers
- Move jc-web demo site from heroku to render.com
In addition to three new parsers, this release includes several enhancements and fixes. The proc-pid-stat parser now supports command names that contain spaces and newlines. The ip-address string parser now includes a new ip-split field which splits each IPv4 octet or IPv6 segment into its own string within a list:
$ echo 192.168.2.10/24 | jc --ip-address -p
{
"version": 4,
"max_prefix_length": 32,
"ip": "192.168.2.10",
"ip_compressed": "192.168.2.10",
"ip_exploded": "192.168.2.10",
"ip_split": [
"192",
"168",
"2",
"10"
],
...
}
The iso-datetime parser has been renamed to datetime-iso. Don’t worry, the old name still works, but will print a deprecation warning to STDERR. This change introduces the new parser deprecation functionality. Deprecated parsers are identified with a deprecated field in the --about JSON output.
Some performance optimizations have been included for calculated timestamps. And, finally, we have moved the jc-web demo from Heroku to Render due to pricing changes.
udevadm command parser
A new udevadm linux command parser has been released. (Documentation)
$ udevadm info --query=all /dev/sda | jc --udevadm -p
{
"P": "/devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/sda",
"N": "sda",
"L": 0,
"S": [
"disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0"
],
"E": {
"DEVPATH": "/devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/sda",
"DEVNAME": "/dev/sda",
"DEVTYPE": "disk",
"MAJOR": "8",
"MINOR": "0",
"SUBSYSTEM": "block",
"USEC_INITIALIZED": "6100111",
"SCSI_TPGS": "0",
"SCSI_TYPE": "disk",
"SCSI_VENDOR": "VMware,",
"SCSI_VENDOR_ENC": "VMware,\\x20",
"SCSI_MODEL": "VMware_Virtual_S",
"SCSI_MODEL_ENC": "VMware\\x20Virtual\\x20S",
"SCSI_REVISION": "1.0",
"ID_SCSI": "1",
"ID_VENDOR": "VMware_",
"ID_VENDOR_ENC": "VMware\\x2c\\x20",
"ID_MODEL": "VMware_Virtual_S",
"ID_MODEL_ENC": "VMware\\x20Virtual\\x20S",
"ID_REVISION": "1.0",
"ID_TYPE": "disk",
"MPATH_SBIN_PATH": "/sbin",
"ID_BUS": "scsi",
"ID_PATH": "pci-0000:00:10.0-scsi-0:0:0:0",
"ID_PATH_TAG": "pci-0000_00_10_0-scsi-0_0_0_0",
"ID_PART_TABLE_UUID": "a5bd0c01-4210-46f2-b558-5c11c209a8f7",
"ID_PART_TABLE_TYPE": "gpt",
"DEVLINKS": "/dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0",
"TAGS": ":systemd:"
}
}
lspci command parser
A new lspci linux command parser has been added. (Documentation)
$ lspci -nnmmv | jc --lspci -p
[
{
"slot": "ff:02:05.0",
"domain": "ff",
"domain_int": 255,
"bus": "02",
"bus_int": 2,
"dev": "05",
"dev_int": 5,
"function": "0",
"function_int": 0,
"class": "SATA controller",
"class_id": "0106",
"class_id_int": 262,
"vendor": "VMware",
"vendor_id": "15ad",
"vendor_id_int": 5549,
"device": "SATA AHCI controller",
"device_id": "07e0",
"device_id_int": 2016,
"svendor": "VMware",
"svendor_id": "15ad",
"svendor_id_int": 5549,
"sdevice": "SATA AHCI controller",
"sdevice_id": "07e0",
"sdevice_id_int": 2016,
"physlot": "37",
"physlot_int": 55,
"progif": "01",
"progif_int": 1
},
...
]
pci.ids file parser
A new file parser for the pci.ids database file has been added. (Documentation) This parser allows you to use tools like jq to query the database. The pci.ids database file can be found here: https://raw.githubusercontent.com/pciutils/pciids/master/pci.ids
$ cat pci.ids | jc --pci-ids | jq '.vendors._001c._0001._001c._0005.subsystem_name' "2 Channel CAN Bus SJC1000 (Optically Isolated)" $ cat pci.ids | jc --pci-ids | jq '.classes._0c._03._40' "USB4 Host Interface"
v1.22.2 Updates
- Add
sshd-confparser forsshdconfiguration files andsshd -Toutput - Add
findmntcommand parser - Add
git ls-remotecommand parser - Add
os-probercommand parser - Add SemVer string parser
- Enhance the
ifconfigparser so it can output multiple IPv4 and IPv6 addresses - Enhance the
ifconfigparser so it can output additional fields common on BSD - Enhance XML file parser with optional
_prefix for attributes instead of@by using the--rawoption. This can make it easier to filter the JSON output in some tools. - Fix the XML file parser to output a normal Dictionary instead of OrderdDict. This cleans up YAML output. (No
!!omapcomments) - Fix the standard and streaming CSV parsers for UTF-8 encoded CSV files with leading BOM bytes
- Fix exit code to be non-zero on keyboard interrupt
- Allow parser module objects to be used as arguments to
jc.get_help()andjc.parser_info() - Catch unexpected exceptions in the CLI
- Add error message on keyboard interrupt to STDERR
- Add python 3.11 tests to GitHub actions
sshd-conf file and command parser
A new sshd-conf file and sshd -T parser has been added. (Documentation)
$ sshd -T | jc --sshd-conf -p
{
"acceptenv": [
"LANG",
"LC_*"
],
"addressfamily": "any",
"allowagentforwarding": "yes",
"allowstreamlocalforwarding": "yes",
"allowtcpforwarding": "yes",
"authenticationmethods": "any",
"authorizedkeyscommand": "none",
"authorizedkeyscommanduser": "none",
"authorizedkeysfile": [
".ssh/authorized_keys",
".ssh/authorized_keys2"
],
"authorizedprincipalscommand": "none",
...
}
findmnt command parser
A new findmnt command parser has been added. (Documentation)
$ findmnt | jc --findmnt -p
[
{
"target": "/",
"source": "/dev/mapper/centos-root",
"fstype": "xfs",
"options": [
"rw",
"relatime",
"seclabel",
"attr2",
"inode64",
"noquota"
]
},
{
"target": "/sys/fs/cgroup",
"source": "tmpfs",
"fstype": "tmpfs",
"options": [
"ro",
"nosuid",
"nodev",
"noexec",
"seclabel"
],
"kv_options": {
"mode": "755"
}
},
...
]
git ls-remote command parser
A new git ls-remote command parser has been added. (Documentation)
$ git ls-remote | jc --git-ls-remote -p
{
"HEAD": "214cd6b9e09603b3c4fa02203b24fb2bc3d4e338",
"refs/heads/dev": "b884f6aacca39e05994596d8fdfa7e7c4f1e0389",
"refs/heads/master": "214cd6b9e09603b3c4fa02203b24fb2bc3d4e338",
"refs/pull/1/head": "e416c77bed1267254da972b0f95b7ff1d43fccef",
...
}
$ git ls-remote | jc --git-ls-remote -p -r
[
{
"reference": "HEAD",
"commit": "214cd6b9e09603b3c4fa02203b24fb2bc3d4e338"
},
{
"reference": "refs/heads/dev",
"commit": "b884f6aacca39e05994596d8fdfa7e7c4f1e0389"
},
...
]
os-prober command parser
A new os-prober command parser has been added. (Documentation)
$ os-prober | jc --os-prober -p
{
"partition": "/dev/sda1",
"name": "Windows 10",
"short_name": "Windows",
"type": "chain"
}
Semantic Version string parser
A new Semantic Version string parser has been added. (Documentation)
$ echo 1.2.3-rc.1+44837 | jc --semver -p
{
"major": 1,
"minor": 2,
"patch": 3,
"prerelease": "rc.1",
"build": "44837"
}
ifconfig command parser enhancements
The ifconfig command parser has been enhanced to support multiple IPv4 and IPv6 addresses. Also many more BSD/macOS fields are parsed.
$ ifconfig | jc --ifconfig -p
[
{
"name": "en0",
"flags": 8863,
"state": [
"UP",
"BROADCAST",
"SMART",
"RUNNING",
"SIMPLEX",
"MULTICAST"
],
"mtu": 1500,
"type": null,
"mac_addr": "f0:18:98:03:d9:30",
"ipv4_addr": "192.168.1.72",
"ipv4_mask": "255.255.255.0",
"ipv4_bcast": "192.168.1.255",
"ipv6_addr": "fe80::8b7:1281:7499:b504",
"ipv6_mask": 64,
"ipv6_scope": "0x8",
"ipv6_type": null,
"metric": null,
"rx_packets": null,
"rx_errors": null,
"rx_dropped": null,
"rx_overruns": null,
"rx_frame": null,
"tx_packets": null,
"tx_errors": null,
"tx_dropped": null,
"tx_overruns": null,
"tx_carrier": null,
"tx_collisions": null,
"rx_bytes": null,
"tx_bytes": null,
"nd6_options": 201,
"nd6_flags": [
"PERFORMNUD",
"DAD"
],
"status": "active",
"ipv4": [
{
"address": "192.168.1.72",
"mask": "255.255.255.0",
"broadcast": "192.168.1.255"
}
],
"ipv6": [
{
"address": "fe80::8b7:1281:7499:b504",
"mask": 64,
"scope": "0x8"
}
]
},
...
]
v1.22.3 Updates
- Add Common Log Format and Combined Log Format file parser (standard and streaming)
- Add PostgreSQL password file parser
- Add
openvpn-status.logfile parser - Add
cbtcommand parser (Google Big Table) - Enhance
ifconfigparser with more information on BSD - Fix
ifconfigparser to capture some IPv6 addresses missed on BSD - Fix
git-logandgit-log-sparsers for failure on empty author name - Update
os-proberparser with split EFI partition fields
v1.22.4 Updates
- Add
iwconfigcommand parser - Add NeXTSTEP format support to the PLIST file parser
- Fix
procparser magic signature detection for/proc/pid/stathacks - Fix
x509-certparser for string serial numbers - Add category tags to parser metadata: generic, standard, file, string, binary, command
- Add “list parsers by category” view to help
- Fix python 3.6-related issues
- Add python 3.6 to automated tests
v1.22.5 Updates
- Add TOML file parser
- Add INI with duplicate key support file parser
- Add AIX support for the
arpcommand parser - Add AIX support for the
mountcommand parser - Fix
lsusbcommand parser when extra hub port status information is output - Fix INI file parser to include top-level values with no section header
- Fix INI file parser to not specially handle the [DEFAULT] section
- Fix INI file and Key/Value parsers to only remove one quotation mark from the
beginning and end of values.
Happy parsing!