Consultez la documentation du package
jc
Python pour les développeurs
Essayez la démo Web
jc
et l'API REST
jc
est disponible en tant que plugin de filtre Ansible dans la collectioncommunity.general
. Voir cet article de blog pour un exemple.
Conversion JSON
jc
JSONifie la sortie de nombreux outils CLI, types de fichiers et chaînes communes pour une analyse plus facile dans les scripts. Consultez la section Analyseurs pour connaître les commandes, les types de fichiers et les chaînes pris en charge.
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 }]
Cela permet un traitement ultérieur en ligne de commande de la sortie avec des outils comme jq
ou jello
en envoyant des commandes :
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
ou en utilisant la syntaxe alternative "magique":
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
peut également être utilisé comme bibliothèque Python. Dans ce cas, la valeur renvoyée sera un dictionnaire python, une liste de dictionnaires, ou même un itérable paresseux de dictionnaires au lieu de 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' }]
Pour la documentation du package
jc
Python, utilisezhelp('jc')
,help('jc.lib')
ou consultez la documentation en ligne.
Deux représentations des données sont disponibles. La représentation par défaut utilise un schéma strict par analyseur et convertit les nombres connus en valeurs JSON int/float. Certaines valeurs connues de None
sont converties en JSON null
, les valeurs booléennes connues sont converties et, dans certains cas, des champs de contexte sémantique supplémentaires sont ajoutés.
Pour accéder au JSON brut et prétraité, utilisez l'option -r
cli ou le paramètre de fonction raw=True
dans parse()
lorsque vous utilisez jc
comme bibliothèque Python.
Les schémas pour chaque analyseur peuvent être trouvés sur le lien de documentation à côté de chaque analyseur ci-dessous.
Les notes de version peuvent être trouvées dans la section Releases sur Github.
Pour plus d'informations sur les motivations de ce projet, veuillez consulter mon article de blog sur Bringing the Unix Philosophy to the 21st Century et mon entretien avec Console.
Voir aussi :
Cas d'utilisation :
Il existe plusieurs façons d'obtenir jc
. Vous pouvez installer via pip
, les référentiels de packages du système d'exploitation ou en téléchargeant le binaire correct pour votre architecture et en l'exécutant n'importe où sur votre système de fichiers.
pip3 install jc
Système d'exploitation | Commande |
---|---|
Linux Debian/Ubuntu | 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 ou nix-env -iA nixos.jc |
Système Guix Linux | guix install jc |
Gentoo Linux | emerge dev-python/jc |
Photon Linux | tdnf install jc |
macOS | brew install jc |
GratuitBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Plugin de filtre Ansible | ansible-galaxy collection install community.general |
Connecteur FortiSOAR | Installer à partir du marché des connecteurs FortiSOAR |
Pour plus de packages de système d'exploitation, consultez https://repology.org/project/jc/versions.
Pour les binaires précompilés, consultez les versions sur Github.
jc
accepte les entrées redirigées de STDIN
et génère une représentation JSON de la sortie de la commande précédente vers STDOUT
.
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
Alternativement, la syntaxe « magique » peut être utilisée en ajoutant jc
à la commande à convertir ou devant le chemin absolu des fichiers Proc. Les options peuvent être transmises à jc
immédiatement avant que la commande ou le chemin du fichier Proc ne soit donné. (Remarque : les alias de commande et les éléments intégrés du shell ne sont pas pris en charge)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
La sortie JSON peut être compacte (par défaut) ou joliment formatée avec l'option -p
.
Argument | Commande ou type de fichier | Documentation |
---|---|---|
--acpi | analyseur de commandes acpi | détails |
--airport | airport -I commande l'analyseur | détails |
--airport-s | analyseur de commandes airport -s | détails |
--apt-cache-show | analyseur de commandes apt-cache show | détails |
--apt-get-sqq | analyseur de commandes apt-get -sqq | détails |
--arp | analyseur de commandes arp | détails |
--asciitable | Analyseur de tables ASCII et Unicode | détails |
--asciitable-m | analyseur de tables multilignes ASCII et Unicode | détails |
--blkid | analyseur de commandes blkid | détails |
--bluetoothctl | analyseur de commandes bluetoothctl | détails |
--cbt | analyseur de commandes cbt (Google Bigtable) | détails |
--cef | analyseur de chaînes CEF | détails |
--cef-s | Analyseur de streaming de chaînes CEF | détails |
--certbot | analyseur de commandes certbot | détails |
--chage | chage --list analyseur de commandes | détails |
--cksum | analyseur de commandes cksum et sum | détails |
--clf | Analyseur de fichiers au format de journal commun et combiné | détails |
--clf-s | Analyseur de streaming de fichiers au format de journal commun et combiné | détails |
--crontab | commande crontab et analyseur de fichiers | détails |
--crontab-u | analyseur de fichiers crontab avec support utilisateur | détails |
--csv | analyseur de fichiers CSV | détails |
--csv-s | Analyseur de streaming de fichiers CSV | détails |
--curl-head | analyseur de commandes curl --head | détails |
--date | analyseur de commandes date | détails |
--datetime-iso | Analyseur de chaînes datetime ISO 8601 | détails |
--debconf-show | analyseur de commandes debconf-show | détails |
--df | analyseur de commandes df | détails |
--dig | analyseur de commandes dig | détails |
--dir | analyseur de commandes dir | détails |
--dmidecode | analyseur de commandes dmidecode | détails |
--dpkg-l | analyseur de commandes dpkg -l | détails |
--du | du analyseur de commandes | détails |
--efibootmgr | analyseur de commandes efibootmgr | détails |
--email-address | Analyseur de chaîne d'adresse e-mail | détails |
--env | analyseur de commandes env | détails |
--ethtool | analyseur de commandes ethtool | détails |
--file | analyseur de commandes file | détails |
--find | find un analyseur de commandes | détails |
--findmnt | analyseur de commandes findmnt | détails |
--finger | analyseur de commandes finger | détails |
--free | analyseur de commandes free | détails |
--fstab | analyseur de fichiers /etc/fstab | détails |
--git-log | analyseur de commandes git log | détails |
--git-log-s | analyseur de streaming de commande git log | détails |
--git-ls-remote | analyseur de commandes git ls-remote | détails |
--gpg | analyseur de commandes gpg --with-colons | détails |
--group | analyseur de fichiers /etc/group | détails |
--gshadow | analyseur de fichiers /etc/gshadow | détails |
--hash | analyseur de commandes hash | détails |
--hashsum | analyseur de commandes hashsum ( md5sum , shasum , etc.) | détails |
--hciconfig | analyseur de commandes hciconfig | détails |
--history | analyseur de commandes history | détails |
--host | analyseur de commandes host | détails |
--hosts | analyseur de fichiers /etc/hosts | détails |
--http-headers | analyseur d'en-têtes HTTP | détails |
--id | id de commande d'identification | détails |
--ifconfig | analyseur de commandes ifconfig | détails |
--ini | Analyseur de fichiers INI | détails |
--ini-dup | INI avec analyseur de fichiers de clés en double | détails |
--iostat | analyseur de commandes iostat | détails |
--iostat-s | analyseur de streaming de commandes iostat | détails |
--ip-address | Analyseur de chaîne d'adresse IPv4 et IPv6 | détails |
--ipconfig | analyseur de commandes Windows ipconfig | détails |
--iptables | analyseur de commandes iptables | détails |
--ip-route | analyseur de commandes ip route | détails |
--iw-scan | iw dev [device] scan de commandes d'analyse | détails |
--iwconfig | analyseur de commandes iwconfig | détails |
--jar-manifest | Analyseur de fichiers Java MANIFEST.MF | détails |
--jobs | analyseur de commandes jobs | détails |
--jwt | analyseur de chaînes JWT | détails |
--kv | Fichier clé/valeur et analyseur de chaînes | détails |
--kv-dup | Clé/Valeur avec fichier de clé en double et analyseur de chaîne | détails |
--last | analyseur de commandes last et lastb | détails |
--ls | analyseur de commandes ls | détails |
--ls-s | analyseur de streaming de commande ls | détails |
--lsattr | analyseur de commandes lsattr | détails |
--lsb-release | analyseur de commandes lsb_release | détails |
--lsblk | analyseur de commandes lsblk | détails |
--lsmod | analyseur de commandes lsmod | détails |
--lsof | analyseur de commandes lsof | détails |
--lspci | analyseur de commandes lspci -mmv | détails |
--lsusb | analyseur de commandes lsusb | détails |
--m3u | Analyseur de fichiers M3U et M3U8 | détails |
--mdadm | analyseur de commandes mdadm | détails |
--mount | mount de commandes de montage | détails |
--mpstat | analyseur de commandes mpstat | détails |
--mpstat-s | analyseur de streaming de commandes mpstat | détails |
--needrestart | analyseur de commandes needrestart -b | détails |
--netstat | analyseur de commandes netstat | détails |
--nmcli | analyseur de commandes nmcli | détails |
--nsd-control | analyseur de commandes nsd-control | détails |
--ntpq | analyseur de commandes ntpq -p | détails |
--openvpn | analyseur de fichier openvpn-status.log | détails |
--os-prober | analyseur de commandes os-prober | détails |
--os-release | analyseur de fichiers /etc/os-release | détails |
--pacman | analyseur de commandes pacman | détails |
--passwd | analyseur de fichiers /etc/passwd | détails |
--path | Analyseur de chaîne de chemin POSIX | détails |
--path-list | Analyseur de chaînes de liste de chemins POSIX | détails |
--pci-ids | analyseur de fichiers pci.ids | détails |
--pgpass | Analyseur de fichiers de mots de passe PostgreSQL | détails |
--pidstat | analyseur de commande pidstat -H | détails |
--pidstat-s | analyseur de streaming de commande pidstat -H | détails |
--ping | analyseur de commandes ping et ping6 | détails |
--ping-s | analyseur de streaming de commandes ping et ping6 | détails |
--pip-list | analyseur de commandes pip list | détails |
--pip-show | analyseur de commandes pip show | détails |
--pkg-index-apk | Analyseur de fichiers d'index de package Linux Alpine | détails |
--pkg-index-deb | Analyseur de fichiers d'index de paquets Debian | détails |
--plist | analyseur de fichiers PLIST | détails |
--postconf | analyseur de commande postconf -M | détails |
--proc | /proc/ analyseur de fichiers | détails |
--ps | analyseur de commandes ps | détails |
--resolve-conf | analyseur de fichiers /etc/resolve.conf | détails |
--route | route de commandes d'itinéraire | détails |
--rpm-qi | analyseur de commandes rpm -qi | détails |
--rsync | analyseur de commandes rsync | détails |
--rsync-s | analyseur de streaming de commande rsync | détails |
--semver | Analyseur de chaîne de version sémantique | détails |
--sfdisk | analyseur de commandes sfdisk | détails |
--shadow | analyseur de fichiers /etc/shadow | détails |
--srt | analyseur de fichiers SRT | détails |
--ss | ss | détails |
--ssh-conf | fichier de configuration ssh et analyseur de commandes ssh -G | détails |
--sshd-conf | fichier de configuration sshd et analyseur de commandes sshd -T | détails |
--stat | analyseur de commandes stat | détails |
--stat-s | analyseur de streaming de commandes stat | détails |
--swapon | analyseur de commandes swapon | détails |
--sysctl | analyseur de commandes sysctl | détails |
--syslog | Analyseur de chaînes Syslog RFC 5424 | détails |
--syslog-s | Analyseur de streaming de chaînes Syslog RFC 5424 | détails |
--syslog-bsd | Analyseur de chaînes Syslog RFC 3164 | détails |
--syslog-bsd-s | Analyseur de streaming de chaînes Syslog RFC 3164 | détails |
--systemctl | analyseur de commandes systemctl | détails |
--systemctl-lj | analyseur de commandes systemctl list-jobs | détails |
--systemctl-ls | analyseur de commandes systemctl list-sockets | détails |
--systemctl-luf | analyseur de commandes systemctl list-unit-files | détails |
--systeminfo | analyseur de commandes systeminfo | détails |
--time | /usr/bin/time analyseur de commandes | détails |
--timedatectl | analyseur de commandes timedatectl status | détails |
--timestamp | Analyseur de chaînes Unix Epoch Timestamp | détails |
--toml | analyseur de fichiers TOML | détails |
--top | analyseur de commandes top -b | détails |
--top-s | analyseur de streaming de commande top -b | détails |
--tracepath | analyseur de commandes tracepath et tracepath6 | détails |
--traceroute | analyseur de commandes traceroute et traceroute6 | détails |
--tune2fs | analyseur de commandes tune2fs -l | détails |
--udevadm | analyseur de commandes udevadm info | détails |
--ufw | analyseur de commandes ufw status | détails |
--ufw-appinfo | analyseur de commandes ufw app info [application] | détails |
--uname | uname -a analyseur de commandes | détails |
--update-alt-gs | analyseur de commandes update-alternatives --get-selections | détails |
--update-alt-q | update-alternatives --query analyseur de commandes | détails |
--upower | analyseur de commandes upower | détails |
--uptime | analyseur de commandes uptime | détails |
--url | Analyseur de chaîne d'URL | détails |
--ver | Analyseur de chaîne de version | détails |
--veracrypt | analyseur de commandes veracrypt | détails |
--vmstat | analyseur de commandes vmstat | détails |
--vmstat-s | analyseur de streaming de commandes vmstat | détails |
--w | w analyseur de commandes | détails |
--wc | analyseur de commandes wc | détails |
--wg-show | analyseur de commandes wg show | détails |
--who | who commande l'analyseur | détails |
--x509-cert | Analyseur de fichiers de certificats X.509 PEM et DER | détails |
--x509-csr | Analyseur de fichiers de demande de certificat X.509 PEM et DER | détails |
--xml | analyseur de fichiers XML | détails |
--xrandr | analyseur de commandes xrandr | détails |
--yaml | analyseur de fichiers YAML | détails |
--zipinfo | analyseur de commandes zipinfo | détails |
--zpool-iostat | analyseur de commandes zpool iostat | détails |
--zpool-status | analyseur de commandes d' zpool status | détails |
Court | Long | Description |
---|---|---|
-a | --about | À propos de jc . Imprime des informations sur jc et les analyseurs (en JSON ou YAML, bien sûr !) |
-C | --force-color | Forcer la sortie des couleurs même lors de l'utilisation de tuyaux (remplace -m et la variable d'environnement NO_COLOR ) |
-d | --debug | Mode débogage. Imprime les messages de trace si des problèmes d'analyse sont rencontrés (utilisez -dd pour un débogage détaillé) |
-h | --help | Aide. Utilisez jc -h --parser_name pour la documentation de l'analyseur. Utilisez deux fois pour afficher les analyseurs cachés (par exemple -hh ). Utilisez trois fois pour afficher les catégories de l'analyseur (par exemple -hhh ). |
-m | --monochrome | Sortie monochrome |
-M | --meta-out | Ajoutez des métadonnées à la sortie, notamment l'horodatage, le nom de l'analyseur, la commande magique, le code de sortie de la commande magique, etc. |
-p | --pretty | Joli formater la sortie JSON |
-q | --quiet | Mode silencieux. Supprime les messages d'avertissement de l'analyseur (utilisez -qq pour ignorer les erreurs de l'analyseur de streaming) |
-r | --raw | Sortie brute. Fournit une sortie plus littérale, généralement avec des valeurs de chaîne et aucun traitement sémantique supplémentaire |
-s | --slurp | Insérez plusieurs lignes dans un tableau. (utilisez -hhh pour trouver des analyseurs compatibles) |
-u | --unbuffer | Sortie sans tampon |
-v | --version | Informations sur les versions |
-y | --yaml-out | Sortie YAML |
-B | --bash-comp | Générer un script de complétion du shell Bash (plus d'informations) |
-Z | --zsh-comp | Générer un script de complétion du shell Zsh (plus d'informations) |
Le découpage de ligne est pris en charge à l'aide de la syntaxe START:STOP
similaire au découpage Python. Cela vous permet de sauter des lignes au début et/ou à la fin de l'entrée STDIN
que vous souhaitez que jc
convertisse.
START
et STOP
peuvent être des entiers positifs ou négatifs ou vides et vous permettent de spécifier le nombre de lignes à sauter et le nombre de lignes à traiter. Les tranches positives et vierges sont les plus efficaces en termes de mémoire. Tout entier négatif dans la tranche utilisera plus de mémoire.
Par exemple, pour ignorer la première et la dernière ligne du texte suivant, vous pouvez exprimer la tranche de plusieurs manières :
$ cat table.txt
# ## We want to skip this header ###
col1 col2
foo 1
bar 2
# ## We want to skip this footer ###
$ cat table.txt | jc 1:-1 --asciitable
[{ " col1 " : " foo " , " col2 " : " 1 " },{ " col1 " : " bar " , " col2 " : " 2 " }]
$ cat table.txt | jc 1:4 --asciitable
[{ " col1 " : " foo " , " col2 " : " 1 " },{ " col1 " : " bar " , " col2 " : " 2 " }]
Dans cet exemple, les tranches de ligne 1:-1
et 1:4
fournissent le même résultat.
Lors de l'utilisation d'entiers positifs, l'emplacement de l'index de STOP
n'est pas inclusif. Les tranches positives comptent à partir de la première ligne de l'entrée vers la fin en commençant à 0
comme première ligne. Les tranches négatives comptent de la dernière ligne vers le début en commençant à -1
comme dernière ligne. C'est également ainsi que fonctionne la fonction de découpage de Python.
Voici une répartition des options de tranche de ligne :
Notation des tranches | Lignes d'entrée traitées |
---|---|
START:STOP | lignes START à STOP - 1 |
START: | lignes START à travers le reste de la sortie |
:STOP | lignes du début jusqu'à STOP - 1 |
-START:STOP | Lignes START depuis la fin jusqu'à STOP - 1 |
START:-STOP | lignes START à STOP lignes à partir de la fin |
-START:-STOP | Lignes START depuis la fin jusqu'aux lignes STOP depuis la fin |
-START: | Lignes START depuis la fin jusqu'au reste de la sortie |
:-STOP | lignes du début aux lignes STOP de la fin |
: | toutes les lignes |
Certains analyseurs prennent en charge la saisie de plusieurs éléments et peuvent générer un tableau de résultats en un seul passage. Slurping fonctionne pour les analyseurs de chaînes qui acceptent une seule ligne d'entrée. (par exemple url
et ip-address
) Pour voir une liste des analyseurs prenant en charge l'option --slurp
, utilisez jc -hhh
.
Par exemple, vous pouvez envoyer un fichier avec plusieurs adresses IP (une par ligne) à jc
avec l'option --slurp
et un tableau de résultats sera affiché :
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
La syntaxe magique des fichiers /proc
prend automatiquement en charge la suppression de plusieurs fichiers (pas besoin d'utiliser l'option --slurp
). Par exemple, vous pouvez convertir plusieurs fichiers PID à la fois :
$ jc /proc/ * /status
[ < multiple output objects > ]
Lorsque la syntaxe magique /proc
est utilisée et que plusieurs fichiers sont sélectionnés, un champ _file
supplémentaire est inséré dans la sortie afin qu'il soit plus facile de savoir à quel fichier chaque objet de sortie fait référence.
Enfin, l'option --meta-out
peut être utilisée conjointement avec une sortie slurped. Dans ce cas, la sortie extraite est enveloppée dans un objet avec la structure suivante :
{
"result" : [ ],
"_jc_meta" : {
"parser" : " url " ,
"timestamp" : 1706235558.654576 ,
"slice_start" : null ,
"slice_end" : null ,
"input_list" : [
" http://www.google.com " ,
" https://www.apple.com " ,
" https://www.microsoft.com "
]
}
}
Avec --meta-out
, input_list
contient une liste d'entrées (chaînes d'entrée réelles ou noms de fichiers /proc
) afin que vous puissiez identifier quel objet de sortie se rapporte à chaque chaîne d'entrée ou nom de fichier /proc
.
Toute erreur fatale dans jc
générera un code de sortie de 100
, sinon le code de sortie sera 0
.
Lorsque vous utilisez la syntaxe "magique" (par exemple jc ifconfig eth0
), jc
stockera le code de sortie du programme en cours d'analyse et l'ajoutera au code de sortie jc
. De cette façon, il est plus facile de déterminer si une erreur provenait du programme analysé ou jc
.
Considérez les exemples suivants utilisant ifconfig
:
code de sortie ifconfig | code de sortie jc | Code de sortie combiné | Interprétation |
---|---|---|---|
0 | 0 | 0 | Aucune erreur |
1 | 0 | 1 | Erreur dans ifconfig |
0 | 100 | 100 | Erreur dans jc |
1 | 100 | 101 | Erreur dans ifconfig et jc |
Lorsque vous utilisez la syntaxe "magique", vous pouvez également récupérer le code de sortie du programme appelé en utilisant l'option --meta-out
ou -M
. Cela ajoutera un objet _jc_meta
à la sortie qui inclura les informations de commande magique, y compris le code de sortie.
Voici un exemple avec ping
:
$ jc --meta-out -p ping -c2 192.168.1.252
{
" destination_ip " : " 192.168.1.252 " ,
" data_bytes " : 56,
" pattern " : null,
" destination " : " 192.168.1.252 " ,
" packets_transmitted " : 2,
" packets_received " : 0,
" packet_loss_percent " : 100.0,
" duplicates " : 0,
" responses " : [
{
" type " : " timeout " ,
" icmp_seq " : 0,
" duplicate " : false
}
],
" _jc_meta " : {
" parser " : " ping " ,
" timestamp " : 1661357115.27949,
" magic_command " : [
" ping " ,
" -c2 " ,
" 192.168.1.252 "
],
" magic_command_exit " : 2
}
}
$ echo $?
2
Vous pouvez spécifier des couleurs personnalisées via la variable d'environnement JC_COLORS
. La variable d'environnement JC_COLORS
prend quatre valeurs de chaîne séparées par des virgules au format suivant :
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
Où les couleurs sont : black
, red
, green
, yellow
, blue
, magenta
, cyan
, gray
, brightblack
brightred
brightgreen
brightyellow
, brightblue
, brightmagenta
, brightcyan
, white
ou default
Par exemple, pour définir les couleurs par défaut :
JC_COLORS=blue,brightblack,magenta,green
ou
JC_COLORS=default,default,default,default
Vous pouvez définir la variable d'environnement NO_COLOR
sur n'importe quelle valeur pour désactiver la sortie couleur dans jc
. Notez que l'utilisation de l'option -C
pour forcer la sortie des couleurs remplacera à la fois la variable d'environnement NO_COLOR
et l'option -m
.
La plupart des analyseurs chargent toutes les données de STDIN
, les analysent, puis génèrent l'intégralité du document JSON en série. Certains analyseurs de streaming (par exemple ls-s
et ping-s
) commencent immédiatement à traiter et à afficher les données ligne par ligne sous forme de lignes JSON (alias NDJSON) lorsqu'elles sont reçues de STDIN
. Cela peut réduire considérablement la quantité de mémoire requise pour analyser de grandes quantités de résultats de commande (par exemple ls -lR /
) et peut parfois traiter les données plus rapidement. Les analyseurs de streaming ont un comportement légèrement différent de celui des analyseurs standard, comme indiqué ci-dessous.
Remarque : les analyseurs de streaming ne peuvent pas être utilisés avec la syntaxe « magique »
Vous souhaiterez peut-être ignorer les erreurs d'analyse lorsque vous utilisez des analyseurs de streaming, car ceux-ci peuvent être utilisés dans des pipelines de traitement de longue durée et les erreurs peuvent rompre le canal. Pour ignorer les erreurs d'analyse, utilisez l'option -qq
cli ou l'argument ignore_exceptions=True
avec la fonction parse()
. Cela ajoutera un objet _jc_meta
à la sortie JSON avec un attribut success
. Si success
est true
, alors il n’y a eu aucun problème pour analyser la ligne. Si success
est false
, alors un problème d'analyse a été trouvé et les champs error
et line
seront ajoutés pour inclure respectivement une courte description de l'erreur et le contenu de la ligne non analysable :
Ligne analysée avec succès avec l'option -qq
:
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
Ligne analysée sans succès avec l'option -qq
:
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
La plupart des systèmes d'exploitation mettent en mémoire tampon la sortie transmise d'un processus à l'autre. La mémoire tampon est généralement d'environ 4 Ko. Lors de l'affichage de la sortie dans le terminal, le tampon du système d'exploitation n'est pas engagé, la sortie est donc immédiatement affichée à l'écran. Cependant, lorsque plusieurs processus sont regroupés, il peut sembler que la sortie se bloque lorsque les données d'entrée sont très lentes (par exemple ping
) :
$ ping 1.1.1.1 | jc --ping-s | jq
En effet, le système d'exploitation utilise le tampon de 4 Ko entre jc
et jq
dans cet exemple. Pour afficher les données sur le terminal en temps réel, vous pouvez désactiver le buffer avec l'option cli -u
(unbuffer) :
$ ping 1.1.1.1 | jc --ping-s -u | jq
{"type":"reply","pattern":null,"timestamp":null,"bytes":"64","respons...}
{"type":"reply","pattern":null,"timestamp":null,"bytes":"64","respons...}
...
Remarque : La sortie sans tampon peut être plus lente pour les flux de données volumineux.
Les analyseurs de streaming acceptent n'importe quel objet itérable et renvoient un objet itérable permettant un traitement paresseux des données. Les données d'entrée doivent itérer sur des lignes de données de chaîne. Des exemples de bonnes données d'entrée sont sys.stdin
ou str.splitlines()
.
Pour utiliser l'objet itérable renvoyé dans votre code, parcourez-le simplement ou utilisez la fonction intégrée next() :
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
Les plugins Parser peuvent être placés dans un dossier jc/jcparsers
dans votre "Répertoire de données d'application" local :
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
Les plugins Parser sont des fichiers de module Python standard. Utilisez l'analyseur jc/parsers/foo.py
ou jc/parsers/foo_s.py (streaming)
comme modèle et placez simplement un fichier .py
dans le sous-dossier jcparsers
. Toutes les dépendances peuvent être placées dans le dossier jc
au-dessus jcparsers
et peuvent être importées dans le code de l'analyseur.
Les noms de fichiers du plugin Parser doivent être des noms de module Python valides et doivent donc commencer par une lettre et être entièrement composés de caractères alphanumériques et de traits de soulignement. Les plugins locaux peuvent remplacer les analyseurs par défaut.
Remarque : Le répertoire de données d'application suit la spécification du répertoire de base XDG.
Pour de meilleurs résultats, définissez les variables d'environnement locales sur C
ou en_US.UTF-8
en modifiant la variable LC_ALL
:
$ LC_ALL=C date | jc --date
Vous pouvez également définir les variables locales individuellement :
$ export LANG=C
$ export LC_NUMERIC=C
Sur certains systèmes plus anciens, la sortie UTF-8 sera rétrogradée en ASCII avec des séquences d'échappement \u
si les paramètres régionaux C
ne prennent pas en charge le codage UTF-8.
Certains analyseurs ont ajouté des champs d'horodatage d'époque calculés à la sortie. À moins qu'un nom de champ d'horodatage n'ait un suffixe _utc
, il est considéré comme naïf. (c'est-à-dire en fonction du fuseau horaire local du système sur lequel l'analyseur jc
a été exécuté).
Si un fuseau horaire UTC peut être détecté dans le texte de la sortie de la commande, l'horodatage tiendra compte du fuseau horaire et aura un suffixe _utc
sur le nom de la clé. (par exemple epoch_utc
) Aucun autre fuseau horaire n'est pris en charge pour les horodatages conscients.
jc
peut être utilisé dans la plupart des shells. Certains shells modernes intègrent des capacités de désérialisation et de filtrage JSON, ce qui rend l'utilisation jc
encore plus pratique.
Par exemple, ce qui suit est possible dans NGS (Next Generation Shell) :
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
Cela exécute jc
, analyse le JSON de sortie et attribue la structure de données résultante à une variable dans une seule ligne de code.
Pour plus d'exemples sur la façon d'utiliser jc
dans d'autres shells, consultez cette page wiki.
Certains analyseurs comme dig
, xml
, csv
, etc. fonctionneront sur n'importe quelle plateforme. Les autres analyseurs qui convertissent la sortie spécifique à la plate-forme généreront un message d'avertissement s'ils sont exécutés sur une plate-forme non prise en charge. Pour voir toutes les informations sur l'analyseur, y compris la compatibilité, exécutez jc -ap
.
Vous pouvez toujours utiliser un analyseur sur une plate-forme non prise en charge. Par exemple, vous souhaiterez peut-être analyser un fichier avec une sortie Linux lsof
sur un ordinateur portable macOS ou Windows. Dans ce cas, vous pouvez supprimer le message d'avertissement avec l'option -q
cli ou le paramètre de fonction quiet=True
dans parse()
:
macOS :
cat lsof.out | jc -q --lsof
ou Windows :
type lsof.out | jc -q --lsof
Testé sur :
N'hésitez pas à ajouter/améliorer du code ou des analyseurs ! Vous pouvez utiliser les analyseurs jc/parsers/foo.py
ou jc/parsers/foo_s.py (streaming)
comme modèle et soumettre votre analyseur avec une pull request.
Veuillez consulter les directives de contribution pour plus d'informations.
ifconfig-parser
par KnightWhoSayNixmltodict
par Martín Blechruamel.yaml
par Anthon van der Neuttrparse
par Luis Benitez Voici quelques exemples de sorties jc
. Pour plus d'exemples, voir ici ou la documentation de l'analyseur.
arp | jc -p --arp # or: jc -p arp
[
{
"address" : " gateway " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:f7:4a:fc " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
},
{
"address" : " 192.168.71.1 " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:c0:00:08 " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
},
{
"address" : " 192.168.71.254 " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:fe:7a:b4 " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
}
]
cat homes.csv
"Sell", "List", "Living", "Rooms", "Beds", "Baths", "Age", "Acres", "Taxes"
142, 160, 28, 10, 5, 3, 60, 0.28, 3167
175, 180, 18, 8, 4, 1, 12, 0.43, 4033
129, 132, 13, 6, 3, 1, 41, 0.33, 1471
...
cat homes.csv | jc -p --csv
[
{
"Sell" : " 142 " ,
"List" : " 160 " ,
"Living" : " 28 " ,
"Rooms" : " 10 " ,
"Beds" : " 5 " ,
"Baths" : " 3 " ,
"Age" : " 60 " ,
"Acres" : " 0.28 " ,
"Taxes" : " 3167 "
},
{
"Sell" : " 175 " ,
"List" : " 180 " ,
"Living" : " 18 " ,
"Rooms" : " 8 " ,
"Beds" : " 4 " ,
"Baths" : " 1 " ,
"Age" : " 12 " ,
"Acres" : " 0.43 " ,
"Taxes" : " 4033 "
},
{
"Sell" : " 129 " ,
"List" : " 132 " ,
"Living" : " 13 " ,
"Rooms" : " 6 " ,
"Beds" : " 3 " ,
"Baths" : " 1 " ,
"Age" : " 41 " ,
"Acres" : " 0.33 " ,
"Taxes" : " 1471 "
}
]
cat /etc/hosts | jc -p --hosts
[
{
"ip" : " 127.0.0.1 " ,
"hostname" : [
" localhost "
]
},
{
"ip" : " ::1 " ,
"hostname" : [
" ip6-localhost " ,
" ip6-loopback "
]
},
{
"ip" : " fe00::0 " ,
"hostname" : [
" ip6-localnet "
]
}
]
ifconfig | jc -p --ifconfig # or: jc -p ifconfig
[
{
"name" : " ens33 " ,
"flags" : 4163 ,
"state" : [
" UP " ,
" BROADCAST " ,
" RUNNING " ,
" MULTICAST "
],
"mtu" : 1500 ,
"ipv4_addr" : " 192.168.71.137 " ,
"ipv4_mask" : " 255.255.255.0 " ,
"ipv4_bcast" : " 192.168.71.255 " ,
"ipv6_addr" : " fe80::c1cb:715d:bc3e:b8a0 " ,
"ipv6_mask" : 64 ,
"ipv6_scope" : " 0x20 " ,
"mac_addr" : " 00:0c:29:3b:58:0e " ,
"type" : " Ethernet " ,
"rx_packets" : 8061 ,
"rx_bytes" : 1514413 ,
"rx_errors" : 0 ,
"rx_dropped" : 0 ,
"rx_overruns" : 0 ,
"rx_frame" : 0 ,
"tx_packets" : 4502 ,
"tx_bytes" : 866622 ,
"tx_errors" : 0 ,
"tx_dropped" : 0 ,
"tx_overruns" : 0 ,
"tx_carrier" : 0 ,
"tx_collisions" : 0 ,
"metric" : null
}
]
cat example.ini
foo = fiz
bar = buz
[section1]
fruit = apple
color = blue
[section2]
fruit = pear
color = green
cat example.ini | jc -p --ini
{
"foo" : " fiz " ,
"bar" : " buz " ,
"section1" : {
"fruit" : " apple " ,
"color" : " blue "
},
"section2" : {
"fruit" : " pear " ,
"color" : " green "
}
}
$ ls -l /usr/bin | jc -p --ls # or: jc -p ls -l /usr/bin
[
{
"filename" : " apropos " ,
"link_to" : " whatis " ,
"flags" : " lrwxrwxrwx. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 6 ,
"date" : " Aug 15 10:53 "
},
{
"filename" : " ar " ,
"flags" : " -rwxr-xr-x. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 62744 ,
"date" : " Aug 8 16:14 "
},
{
"filename" : " arch " ,
"flags" : " -rwxr-xr-x. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 33080 ,
"date" : " Aug 19 23:25 "
}
]
netstat -apee | jc -p --netstat # or: jc -p netstat -apee
[
{
"proto" : " tcp " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " localhost " ,
"foreign_address" : " 0.0.0.0 " ,
"state" : " LISTEN " ,
"user" : " systemd-resolve " ,
"inode" : 26958 ,
"program_name" : " systemd-resolve " ,
"kind" : " network " ,
"pid" : 887 ,
"local_port" : " domain " ,
"foreign_port" : " * " ,
"transport_protocol" : " tcp " ,
"network_protocol" : " ipv4 "
},
{
"proto" : " tcp6 " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " [::] " ,
"foreign_address" : " [::] " ,
"state" : " LISTEN " ,
"user" : " root " ,
"inode" : 30510 ,
"program_name" : " sshd " ,
"kind" : " network " ,
"pid" : 1186 ,
"local_port" : " ssh " ,
"foreign_port" : " * " ,
"transport_protocol" : " tcp " ,
"network_protocol" : " ipv6 "
},
{
"proto" : " udp " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " localhost " ,
"foreign_address" : " 0.0.0.0 " ,
"state" : null ,
"user" : " systemd-resolve " ,
"inode" : 26957 ,
"program_name" : " systemd-resolve " ,
"kind" : " network " ,
"pid" : 887 ,
"local_port" : " domain " ,
"foreign_port" : " * " ,
"transport_protocol" : " udp " ,
"network_protocol" : " ipv4 "
},
{
"proto" : " raw6 " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " [::] " ,
"foreign_address" : " [::] " ,
"state" : " 7 " ,
"user" : " systemd-network " ,
"inode" : 27001 ,
"program_name" : " systemd-network " ,
"kind" : " network " ,
"pid" : 867 ,
"local_port" : " ipv6-icmp " ,
"foreign_port" : " * " ,
"transport_protocol" : null ,
"network_protocol" : " ipv6 "
},
{
"proto" : " unix " ,
"refcnt" : 2 ,
"flags" : null ,
"type" : " DGRAM " ,
"state" : null ,
"inode" : 33322 ,
"program_name" : " systemd " ,
"path" : " /run/user/1000/systemd/notify " ,
"kind" : " socket " ,
"pid" : 1607
}
]
cat /etc/passwd | jc -p --passwd
[
{
"username" : " root " ,
"password" : " * " ,
"uid" : 0 ,
"gid" : 0 ,
"comment" : " System Administrator " ,
"home" : " /var/root " ,
"shell" : " /bin/sh "
},
{
"username" : " daemon " ,
"password" : " * " ,
"uid" : 1 ,
"gid" : 1 ,
"comment" : " System Services " ,
"home" : " /var/root " ,
"shell" : " /usr/bin/false "
}
]
ping 8.8.8.8 -c 3 | jc -p --ping # 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
}
]
}
ps axu | jc -p --ps # or: jc -p ps axu
[
{
"user" : " root " ,
"pid" : 1 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.1 ,
"vsz" : 128072 ,
"rss" : 6784 ,
"tty" : null ,
"stat" : " Ss " ,
"start" : " Nov09 " ,
"time" : " 0:08 " ,
"command" : " /usr/lib/systemd/systemd --switched-root --system --deseria... "
},
{
"user" : " root " ,
"pid" : 2 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.0 ,
"vsz" : 0 ,
"rss" : 0 ,
"tty" : null ,
"stat" : " S " ,
"start" : " Nov09 " ,
"time" : " 0:00 " ,
"command" : " [kthreadd] "
},
{
"user" : " root " ,
"pid" : 4 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.0 ,
"vsz" : 0 ,
"rss" : 0 ,
"tty" : null ,
"stat" : " S< " ,
"start" : " Nov09 " ,
"time" : " 0:00 " ,
"command" : " [kworker/0:0H] "
}
]
traceroute -m 2 8.8.8.8 | jc -p --traceroute
# or: jc -p traceroute -m 2 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
}
]
}
]
}
uptime | jc -p --uptime # or: jc -p uptime
{
"time" : " 11:35 " ,
"uptime" : " 3 days, 4:03 " ,
"users" : 5 ,
"load_1m" : 1.88 ,
"load_5m" : 2.0 ,
"load_15m" : 1.94 ,
"time_hour" : 11 ,
"time_minute" : 35 ,
"time_second" : null ,
"uptime_days" : 3 ,
"uptime_hours" : 4 ,
"uptime_minutes" : 3 ,
"uptime_total_seconds" : 273780
}
cat cd_catalog.xml
xml version = " 1.0 " encoding = " UTF-8 " ?> < CATALOG > < CD > < TITLE >Empire Burlesque TITLE > < ARTIST >Bob Dylan ARTIST > < COUNTRY >USA COUNTRY > < COMPANY >Columbia COMPANY > < PRICE >10.90 PRICE > < YEAR >1985 YEAR > CD > < CD > < TITLE >Hide your heart TITLE > < ARTIST >Bonnie Tyler ARTIST > < COUNTRY >UK COUNTRY > < COMPANY >CBS Records COMPANY > < PRICE >9.90 PRICE > < YEAR >1988 YEAR > CD > ...
cat cd_catalog.xml | jc -p --xml
{
"CATALOG" : {
"CD" : [
{
"TITLE" : " Empire Burlesque " ,
"ARTIST" : " Bob Dylan " ,
"COUNTRY" : " USA " ,
"COMPANY" : " Columbia " ,
"PRICE" : " 10.90 " ,
"YEAR" : " 1985 "
},
{
"TITLE" : " Hide your heart " ,
"ARTIST" : " Bonnie Tyler " ,
"COUNTRY" : " UK " ,
"COMPANY" : " CBS Records " ,
"PRICE" : " 9.90 " ,
"YEAR" : " 1988 "
}
]
}
}
cat istio.yaml
apiVersion : " authentication.istio.io/v1alpha1 "
kind : " Policy "
metadata :
name : " default "
namespace : " default "
spec :
peers :
- mtls : {}
---
apiVersion : " networking.istio.io/v1alpha3 "
kind : " DestinationRule "
metadata :
name : " default "
namespace : " default "
spec :
host : " *.default.svc.cluster.local "
trafficPolicy :
tls :
mode : ISTIO_MUTUAL
cat istio.yaml | jc -p --yaml
[
{
"apiVersion" : " authentication.istio.io/v1alpha1 " ,
"kind" : " Policy " ,
"metadata" : {
"name" : " default " ,
"namespace" : " default "
},
"spec" : {
"peers" : [
{
"mtls" : {}
}
]
}
},
{
"apiVersion" : " networking.istio.io/v1alpha3 " ,
"kind" : " DestinationRule " ,
"metadata" : {
"name" : " default " ,
"namespace" : " default "
},
"spec" : {
"host" : " *.default.svc.cluster.local " ,
"trafficPolicy" : {
"tls" : {
"mode" : " ISTIO_MUTUAL "
}
}
}
}
]
© 2019-2024 Kelly Brésil