cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

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 pour dpkg -l
  • du
  • env
  • file
  • finger
  • free
  • git: parser --git-log pour git log
  • git: parser --git-log-s pour git log en mode flux
  • gpg
  • hash
  • --hashsum – Pour les commandes: md5sum, shasum, etc.
  • hciconfig
  • history
  • id
  • ifconfig
  • iostat : ainsi que --iostat-s en mode flux
  • iptables
  • iw: uniquement iw dev [device] avec --iw-scan
  • jobs
  • last
  • lastb
  • ls : ainsi que --ls-s en mode flux
  • lsblk
  • lsmod
  • lsof
  • lspci
  • lsusb
  • mdadm
  • mount
  • mpstat: ainsi que --mpstat-s en mode flux
  • netstat
  • nmcli
  • ntpq: pour ntpq -p
  • pidstat: ainsi que --pidstat-s en mode flux
  • ping: ainsi que --ping-s en mode flux
  • ping6: ainsi que --ping-s en mode flux
  • pip: pip list avec --pip-list et pip show avec --pip-show
  • postconf pour postconf -M avec --postconf
  • ps
  • route
  • rpm pour rpm -qi avec --rpm-qi
  • rsync: ainsi que --rsync-s en mode flux
  • sfdisk
  • ss
  • stat: ainsi que --stat-s en mode flux
  • sysctl
  • systemctl
  • systemctl list-jobs avec --systemctl-lj
  • systemctl list-sockets avec --systemctl-ls
  • systemctl list-unit-files avec --systemctl-luf
  • time: pour la commande /usr/bin/time (pas celle du bash)
  • timedatectl
  • top pour top -b ainsi que --top-s en mode flux
  • tracepath
  • tracepath6
  • traceroute
  • traceroute6
  • udevadm
  • ufw pour ufw status avec --ufw et ufw app info [application] avec --ufw-appinfo
  • uname
  • update-alternatives pour update-alternatives --get-selections avec --update-alt-gs et update-alternatives --query pour --update-alt-q
  • upower
  • uptime
  • vmstat: ainsi que --vmstat-s en mode flux
  • w
  • 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

ᦿ


ℹ 2006 - 2022 | 🏠 Accueil du domaine | 🏡 Accueil du blog