Si de plus en plus de commandes Linux, comme systemctl ou ip offrent une sortie JSON, ce n’est pas encore le cas pour toutes.
Avec jq, il est bien évidement possible d’analyser la sortie d'une commande et de la convertir en JSON, mais c’est un travail assez pénible.
Et c’est justement ce que fait la commande jc. Elle prend en charge la conversion la sortie d’un certain nombre de commandes pour les convertir en JSON.
Quelques exemples
Le plus simple pour comprendre ce que fait jc est de voir quelques exemples :
La commande « dig »
-
dig
Utilisation standard de la commande dig :
dig www.exemple.org
produit une sortie du type :
; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> www.exemple.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21202 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;www.exemple.org. IN A ;; ANSWER SECTION: www.exemple.org. 300 IN A 64.190.63.111 ;; Query time: 52 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Sat Nov 05 18:56:48 CET 2022 ;; MSG SIZE rcvd: 60
Avec la commande jc on écrira :
jc -p dig www.exemple.org
ce qui donnera :
[ { "id": 18631, "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": 65494 } }, "question": { "name": "www.exemple.org.", "class": "IN", "type": "A" }, "answer": [ { "name": "www.exemple.org.", "class": "IN", "type": "A", "ttl": 262, "data": "64.190.63.111" } ], "query_time": 0, "server": "127.0.0.53#53(127.0.0.53) (UDP)", "when": "Sat Nov 05 18:57:25 CET 2022", "rcvd": 60, "when_epoch": 1667671045, "when_epoch_utc": null } ]
La commande « time »
-
time
Utilisation standard de la commande :
date
produit une sortie du type :
sam. 05 nov. 2022 19:08:06 CET
Avec la commande jc on écrira :
jc -p date
ce qui donnera :
{ "year": 2022, "month": "nov.", "month_num": 11, "day": 5, "weekday": "sam.", "weekday_num": 6, "hour": 7, "hour_24": 19, "minute": 7, "second": 57, "period": "", "timezone": "CET", "utc_offset": null, "day_of_year": 309, "week_of_year": 44, "iso": "2022-11-05T19:07:57", "epoch": 1667671677, "epoch_utc": null, "timezone_aware": false }
La commande « df »
-
df
Utilisation standard de la commande :
df
produit une sortie du type :
Filesystem 1K-blocks Used Available Use% Mounted on tmpfs 1621832 2104 1619728 1% /run /dev/nvme0n1p2 244506940 108144128 123869756 47% / tmpfs 8109156 8424 8100732 1% /dev/shm tmpfs 5120 4 5116 1% /run/lock /dev/nvme0n1p1 523248 5364 517884 2% /boot/efi /dev/sda1 960302096 898304348 13143324 99% /mnt/data tmpfs 1621828 208 1621620 1% /run/user/1001
Avec la commande jc on écrira :
jc -p df
ce qui donnera :
[ { "filesystem": "tmpfs", "1k_blocks": 1621832, "used": 2104, "available": 1619728, "mounted_on": "/run", "use_percent": 1 }, { "filesystem": "/dev/nvme0n1p2", "1k_blocks": 244506940, "used": 108144108, "available": 123869776, "mounted_on": "/", "use_percent": 47 }, { "filesystem": "tmpfs", "1k_blocks": 8109156, "used": 8424, "available": 8100732, "mounted_on": "/dev/shm", "use_percent": 1 }, { "filesystem": "tmpfs", "1k_blocks": 5120, "used": 4, "available": 5116, "mounted_on": "/run/lock", "use_percent": 1 }, { "filesystem": "/dev/nvme0n1p1", "1k_blocks": 523248, "used": 5364, "available": 517884, "mounted_on": "/boot/efi", "use_percent": 2 }, { "filesystem": "/dev/sda1", "1k_blocks": 960302096, "used": 898304348, "available": 13143324, "mounted_on": "/mnt/data", "use_percent": 99 }, { "filesystem": "tmpfs", "1k_blocks": 1621828, "used": 208, "available": 1621620, "mounted_on": "/run/user/1001", "use_percent": 1 } ]
Installation
Plusieurs options s’offrent à vous pour installer jc. Il est présent dans les dépôts Ubuntu sous le nom de package jc
:
sudo apt install jc
Cependant avec cette méthode vous obtiendrez la version 1.17.3 (au jour de l'écriture de ce billet).
La commande jc étant écrite en Python, vous pouvez également l'installer à l'aide de pip3.
pip3 install --upgrade jc # Notez que cette syntaxe installera jc que pour l’utilisateur courant.
Cette fois, c’est la version 1.22.1 que vous installerez.
Référez-vous au code source pour connaître la dernière version.
Syntaxe
L'utilisation basique de jc est la suivante:
COMMANDE PARAMETRES… | jc PARSER_POUR_COMMANDE [OPTIONS]
ou la syntaxe « magique » :
jc [OPTIONS] COMMAND
Concrètement :
ifconfig lo | /bin/jc --ifconfig
/bin/jc ifconfig lo
Conflit potentiel avec la commande jc
Le paquet autojump
documente également une commande jc, mais celle-ci est déclarée comme une fonction de votre shell.
C’est facile à vérifier, si la commande suivante vous retourne quelque chose, c’est qu’il y a un conflit.
declare -f jc
Depuis la ligne de commande (directement dans un terminal), c'est la fonction qui primera. Et donc c'est autojump qui sera utilisé.
Notez que depuis un script, la fonction ne sera pas vue et donc pas appelée (sauf à ce que vous utilisiez des paramètres spécifiques pour cela) – donc pas de conflit dans ce cas. Le paquet autojump étant justement construit pour ne pas être exécuté par les scripts.
Pour savoir où se trouve la commande jc, vous pouvez utiliser which ou whereis :
La commande which retourne le chemin de la commande qui sera utilisée:
which jc
La commande whereis retourne éventuellement plusieurs chemins: celui de l’exécutable, du code source ainsi que celui du manuel.
Dans certain cas, il est possible que la commande retourne plusieurs exécutables, par exemple, si vous installer le paquet jc
à l'aide d'apt et la commande jc à l’aide de pip3.
whereis jc
Les commandes Linux prises en charge par « jc »
acpi
arp
blkid
chage
cksum
crontab
date
df
dig
dmidecode
dpkg
: parser --dpkg-l pourdpkg -l
du
env
file
finger
free
git
: parser --git-log pourgit log
git
: parser --git-log-s pourgit log
en mode fluxgpg
hash
- --hashsum – Pour les commandes:
md5sum
,shasum
, etc. hciconfig
history
id
ifconfig
iostat
: ainsi que --iostat-s en mode fluxiptables
iw
: uniquementiw dev [device]
avec --iw-scanjobs
last
lastb
ls
: ainsi que --ls-s en mode fluxlsblk
lsmod
lsof
lspci
lsusb
mdadm
mount
mpstat
: ainsi que --mpstat-s en mode fluxnetstat
nmcli
ntpq
: pourntpq -p
pidstat
: ainsi que --pidstat-s en mode fluxping
: ainsi que --ping-s en mode fluxping6
: ainsi que --ping-s en mode fluxpip
:pip list
avec --pip-list etpip show
avec --pip-showpostconf
pourpostconf -M
avec --postconfps
route
rpm
pourrpm -qi
avec --rpm-qirsync
: ainsi que --rsync-s en mode fluxsfdisk
ss
stat
: ainsi que --stat-s en mode fluxsysctl
systemctl
systemctl list-jobs
avec --systemctl-ljsystemctl list-sockets
avec --systemctl-lssystemctl list-unit-files
avec --systemctl-luftime
: pour la commande/usr/bin/time
(pas celle du bash)timedatectl
top
pourtop -b
ainsi que --top-s en mode fluxtracepath
tracepath6
traceroute
traceroute6
udevadm
ufw
pourufw status
avec --ufw etufw app info [application]
avec --ufw-appinfouname
update-alternatives
pourupdate-alternatives --get-selections
avec --update-alt-gs etupdate-alternatives --query
pour --update-alt-qupower
uptime
vmstat
: ainsi que --vmstat-s en mode fluxw
wc
who
xrandr
zipinfo
Les types pris en charge par « jc »
- --asciitable – Tableau ASCII et Unicode
- --asciitable-m – Tableau ASCII et Unicode multi-ligne
- --cef – Chaîne CEF
- --cef-s – Chaîne CEF en mode flux
- --csv – Fichiers CSV
- --csv-s – Fichiers CSV en mode flux
- --email-address – Chaîne contenant une adresse e-mail
- --fstab – Fichier
/etc/fstab
- --group – Fichier
/etc/group
- --gshadow – Fichier
/etc/gshadow
- --hosts – Fichier
/etc/hosts
- --ini – Fichiers INI
- --ip-address – Pour les chaînes IPv4 et IPv6
- --jar-manifest – Fichier MANIFEST.MF Java
- --jwt – JWT string parser
- --kv – Fichiers clé/valeur (type properties)
- --m3u – Fichiers M3U et M3U8
- --passwd – Fichier
/etc/passwd
- --pci-ids – Fichiers
pci.ids
- --plist – Fichiers PLIST
- --proc – Fichiers sous
/proc/
- --shadow – Fichier
/etc/shadow
- --syslog – Chaîne Syslog RFC 5424
- --syslog-s – Chaîne Syslog RFC 5424 en mode flux
- --syslog-bsd – Chaîne Syslog RFC 3164
- --syslog-bsd-s – Chaîne Syslog RFC 3164 en mode flux
- --timestamp – Chaîne contenant une date au format Unix Epoch
- --url – Chaîne contenant une URL
- --x509-cert – Fichiers certificat X.509 PEM et DER
- --xml – Fichiers XML
- --yaml – Fichiers YAML
Liens
- Tips on Adding JSON Output to Your CLI App,
- Documentation de jc,
- Le code source de jc,
- La FAQ de jq en anglais,
- Le manuel de jq en anglais (Vous pouvez choisir la version de jq).
ᦿ