Sehen Sie sich die Dokumentation
jc
Python-Paket für Entwickler an
Probieren Sie die
jc
Webdemo und die REST-API aus
jc
ist als Ansible-Filter-Plugin in dercommunity.general
Sammlung verfügbar. Ein Beispiel finden Sie in diesem Blogbeitrag.
JSON-Konvertierung
jc
JSON optimiert die Ausgabe vieler CLI-Tools, Dateitypen und allgemeiner Zeichenfolgen, um das Parsen in Skripts zu erleichtern. Informationen zu unterstützten Befehlen, Dateitypen und Zeichenfolgen finden Sie im Abschnitt „Parser“ .
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 }]
Dies ermöglicht eine weitere Befehlszeilenverarbeitung der Ausgabe mit Tools wie jq
oder jello
durch Weiterleiten von Befehlen:
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
oder mit der alternativen „magischen“ Syntax:
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
kann auch als Python-Bibliothek verwendet werden. In diesem Fall ist der zurückgegebene Wert ein Python-Wörterbuch, eine Liste von Wörterbüchern oder sogar eine Lazy-Iterable von Wörterbüchern anstelle von 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' }]
Für die Dokumentation
jc
Python-Pakets verwenden Siehelp('jc')
,help('jc.lib')
oder sehen Sie sich die Online-Dokumentation an.
Es stehen zwei Darstellungen der Daten zur Verfügung. Die Standarddarstellung verwendet ein striktes Schema pro Parser und konvertiert bekannte Zahlen in int/float-JSON-Werte. Bestimmte bekannte Werte von None
werden in JSON null
konvertiert, bekannte boolesche Werte werden konvertiert und in einigen Fällen werden zusätzliche semantische Kontextfelder hinzugefügt.
Um auf das rohe, vorverarbeitete JSON zuzugreifen, verwenden Sie die Option -r
cli oder den Funktionsparameter raw=True
in parse()
wenn Sie jc
als Python-Bibliothek verwenden.
Schemata für jeden Parser finden Sie unter dem Dokumentationslink neben jedem Parser unten.
Versionshinweise finden Sie im Abschnitt „Releases“ auf Github.
Weitere Informationen zu den Beweggründen für dieses Projekt finden Sie in meinem Blogbeitrag „Die Unix-Philosophie ins 21. Jahrhundert bringen“ und in meinem Interview mit Console.
Siehe auch:
Anwendungsfälle:
Es gibt mehrere Möglichkeiten, an jc
zu gelangen. Sie können die Installation über pip
, Betriebssystempaket-Repositorys oder durch Herunterladen der richtigen Binärdatei für Ihre Architektur und Ausführen an einer beliebigen Stelle in Ihrem Dateisystem durchführen.
pip3 install jc
Betriebssystem | Befehl |
---|---|
Debian/Ubuntu-Linux | 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 oder nix-env -iA nixos.jc |
Guix System Linux | guix install jc |
Gentoo Linux | emerge dev-python/jc |
Photon-Linux | tdnf install jc |
macOS | brew install jc |
FreeBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Ansible-Filter-Plugin | ansible-galaxy collection install community.general |
FortiSOAR-Anschluss | Installation vom FortiSOAR Connector Marketplace |
Weitere Betriebssystempakete finden Sie unter https://repology.org/project/jc/versions.
Informationen zu vorkompilierten Binärdateien finden Sie unter Veröffentlichungen auf Github.
jc
akzeptiert weitergeleitete Eingaben von STDIN
und gibt eine JSON-Darstellung der Ausgabe des vorherigen Befehls an STDOUT
aus.
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
Alternativ kann die „magische“ Syntax verwendet werden, indem jc
dem zu konvertierenden Befehl oder vor dem absoluten Pfad für Proc-Dateien vorangestellt wird. Optionen können unmittelbar vor der Angabe des Befehls oder des Proc-Dateipfads an jc
übergeben werden. (Hinweis: Befehlsaliase und Shell-Builtins werden nicht unterstützt)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
Die JSON-Ausgabe kann kompakt (Standard) oder mit der Option -p
hübsch formatiert sein.
Argument | Befehl oder Dateityp | Dokumentation |
---|---|---|
--acpi | acpi -Befehlsparser | Details |
--airport | airport -I befehle Parser | Details |
--airport-s | airport -s Befehlsparser | Details |
--apt-cache-show | apt-cache show Befehlsparser | Details |
--apt-get-sqq | apt-get -sqq Befehlsparser | Details |
--arp | arp -Befehlsparser | Details |
--asciitable | ASCII- und Unicode-Tabellenparser | Details |
--asciitable-m | Mehrzeiliger ASCII- und Unicode-Tabellenparser | Details |
--blkid | blkid -Befehlsparser | Details |
--bluetoothctl | bluetoothctl -Befehlsparser | Details |
--cbt | cbt (Google Bigtable) Befehlsparser | Details |
--cef | CEF-String-Parser | Details |
--cef-s | CEF-String-Streaming-Parser | Details |
--certbot | certbot -Befehlsparser | Details |
--chage | chage --list Befehlsparser | Details |
--cksum | cksum und sum -Befehlsparser | Details |
--clf | Dateiparser für allgemeine und kombinierte Protokollformate | Details |
--clf-s | Datei-Streaming-Parser für allgemeine und kombinierte Protokollformate | Details |
--crontab | crontab -Befehl und Dateiparser | Details |
--crontab-u | crontab Dateiparser mit Benutzerunterstützung | Details |
--csv | CSV-Dateiparser | Details |
--csv-s | CSV-Datei-Streaming-Parser | Details |
--curl-head | curl --head Befehlsparser | Details |
--date | date | Details |
--datetime-iso | ISO 8601 Datetime-String-Parser | Details |
--debconf-show | debconf-show -Befehlsparser | Details |
--df | df -Befehlsparser | Details |
--dig | dig -Befehlsparser | Details |
--dir | dir -Befehlsparser | Details |
--dmidecode | dmidecode Befehlsparser | Details |
--dpkg-l | dpkg -l Befehlsparser | Details |
--du | du Befehlsparser | Details |
--efibootmgr | efibootmgr -Befehlsparser | Details |
--email-address | E-Mail-Adress-String-Parser | Details |
--env | env -Befehlsparser | Details |
--ethtool | ethtool Befehlsparser | Details |
--file | file | Details |
--find | Befehlsparser find | Details |
--findmnt | findmnt -Befehlsparser | Details |
--finger | finger | Details |
--free | free Befehlsparser | Details |
--fstab | /etc/fstab Dateiparser | Details |
--git-log | git log -Befehlsparser | Details |
--git-log-s | git log -Befehls-Streaming-Parser | Details |
--git-ls-remote | git ls-remote Befehlsparser | Details |
--gpg | gpg --with-colons Befehlsparser | Details |
--group | /etc/group Dateiparser | Details |
--gshadow | /etc/gshadow Dateiparser | Details |
--hash | hash -Befehlsparser | Details |
--hashsum | Hashsum-Befehlsparser ( md5sum , shasum usw.) | Details |
--hciconfig | hciconfig -Befehlsparser | Details |
--history | history | Details |
--host | host -Befehlsparser | Details |
--hosts | /etc/hosts Dateiparser | Details |
--http-headers | HTTP-Header-Parser | Details |
--id | id Befehlsparser | Details |
--ifconfig | ifconfig Befehlsparser | Details |
--ini | INI-Dateiparser | Details |
--ini-dup | INI mit Parser für doppelte Schlüsseldateien | Details |
--iostat | iostat Befehlsparser | Details |
--iostat-s | iostat Befehls-Streaming-Parser | Details |
--ip-address | Parser für IPv4- und IPv6-Adresszeichenfolgen | Details |
--ipconfig | ipconfig Windows-Befehlsparser | Details |
--iptables | iptables Befehlsparser | Details |
--ip-route | ip route Befehlsparser | Details |
--iw-scan | iw dev [device] scan Befehlsparser | Details |
--iwconfig | iwconfig Befehlsparser | Details |
--jar-manifest | Java MANIFEST.MF-Dateiparser | Details |
--jobs | jobs -Befehlsparser | Details |
--jwt | JWT-String-Parser | Details |
--kv | Schlüssel/Wert-Datei und String-Parser | Details |
--kv-dup | Schlüssel/Wert mit doppelter Schlüsseldatei und String-Parser | Details |
--last | last und lastb Befehlsparser | Details |
--ls | ls Befehlsparser | Details |
--ls-s | ls -Befehls-Streaming-Parser | Details |
--lsattr | lsattr -Befehlsparser | Details |
--lsb-release | lsb_release -Befehlsparser | Details |
--lsblk | lsblk Befehlsparser | Details |
--lsmod | lsmod -Befehlsparser | Details |
--lsof | lsof Befehlsparser | Details |
--lspci | lspci -mmv Befehlsparser | Details |
--lsusb | lsusb Befehlsparser | Details |
--m3u | M3U- und M3U8-Dateiparser | Details |
--mdadm | mdadm -Befehlsparser | Details |
--mount | mount -Befehlsparser | Details |
--mpstat | mpstat Befehlsparser | Details |
--mpstat-s | mpstat Befehls-Streaming-Parser | Details |
--needrestart | needrestart -b Befehlsparser | Details |
--netstat | netstat Befehlsparser | Details |
--nmcli | nmcli -Befehlsparser | Details |
--nsd-control | nsd-control -Befehlsparser | Details |
--ntpq | ntpq -p Befehlsparser | Details |
--openvpn | openvpn-status.log-Dateiparser | Details |
--os-prober | os-prober -Befehlsparser | Details |
--os-release | /etc/os-release Dateiparser | Details |
--pacman | pacman -Befehlsparser | Details |
--passwd | /etc/passwd Dateiparser | Details |
--path | POSIX-Pfad-String-Parser | Details |
--path-list | POSIX-Pfadlisten-String-Parser | Details |
--pci-ids | pci.ids Dateiparser | Details |
--pgpass | Parser für PostgreSQL-Passwortdateien | Details |
--pidstat | pidstat -H Befehlsparser | Details |
--pidstat-s | pidstat -H Befehls-Streaming-Parser | Details |
--ping | ping und ping6 -Befehlsparser | Details |
--ping-s | ping und ping6 Befehls-Streaming-Parser | Details |
--pip-list | pip list -Befehlsparser | Details |
--pip-show | pip show Befehlsparser | Details |
--pkg-index-apk | Alpine Linux Package Index-Dateiparser | Details |
--pkg-index-deb | Parser für Debian-Paketindexdateien | Details |
--plist | PLIST-Dateiparser | Details |
--postconf | postconf -M Befehlsparser | Details |
--proc | /proc/ Dateiparser | Details |
--ps | ps -Befehlsparser | Details |
--resolve-conf | /etc/resolve.conf | Details |
--route | route Befehlsparser | Details |
--rpm-qi | rpm -qi Befehlsparser | Details |
--rsync | rsync Befehlsparser | Details |
--rsync-s | rsync Befehls-Streaming-Parser | Details |
--semver | Semantischer Versions-String-Parser | Details |
--sfdisk | sfdisk Befehlsparser | Details |
--shadow | /etc/shadow -Dateiparser | Details |
--srt | SRT-Dateiparser | Details |
--ss | ss -Befehlsparser | Details |
--ssh-conf | ssh Konfigurationsdatei und ssh -G Befehlsparser | Details |
--sshd-conf | sshd -Konfigurationsdatei und sshd -T Befehlsparser | Details |
--stat | stat -Befehlsparser | Details |
--stat-s | stat Befehls-Streaming-Parser | Details |
--swapon | swapon -Befehlsparser | Details |
--sysctl | sysctl Befehlsparser | Details |
--syslog | Syslog RFC 5424 String-Parser | Details |
--syslog-s | Syslog RFC 5424 String-Streaming-Parser | Details |
--syslog-bsd | Syslog RFC 3164 String-Parser | Details |
--syslog-bsd-s | Syslog RFC 3164 String-Streaming-Parser | Details |
--systemctl | systemctl Befehlsparser | Details |
--systemctl-lj | systemctl list-jobs Befehlsparser | Details |
--systemctl-ls | systemctl list-sockets Befehlsparser | Details |
--systemctl-luf | systemctl list-unit-files Befehlsparser | Details |
--systeminfo | systeminfo Befehlsparser | Details |
--time | /usr/bin/time Befehlsparser | Details |
--timedatectl | timedatectl status Statusbefehlsparser | Details |
--timestamp | Unix Epoch Timestamp-String-Parser | Details |
--toml | TOML-Dateiparser | Details |
--top | top -b Befehlsparser | Details |
--top-s | top -b Befehls-Streaming-Parser | Details |
--tracepath | tracepath und tracepath6 -Befehlsparser | Details |
--traceroute | traceroute und traceroute6 -Befehlsparser | Details |
--tune2fs | tune2fs -l Befehlsparser | Details |
--udevadm | udevadm info -Befehlsparser | Details |
--ufw | ufw status Statusbefehlsparser | Details |
--ufw-appinfo | ufw app info [application] Befehlsparser | Details |
--uname | uname -a Befehlsparser | Details |
--update-alt-gs | update-alternatives --get-selections Befehlsparser | Details |
--update-alt-q | update-alternatives --query Befehlsparser | Details |
--upower | upower Befehlsparser | Details |
--uptime | uptime -Befehlsparser | Details |
--url | URL-String-Parser | Details |
--ver | Parser für Versionszeichenfolgen | Details |
--veracrypt | veracrypt -Befehlsparser | Details |
--vmstat | vmstat Befehlsparser | Details |
--vmstat-s | vmstat -Befehls-Streaming-Parser | Details |
--w | w -Befehlsparser | Details |
--wc | wc Befehlsparser | Details |
--wg-show | wg show | Details |
--who | who befehligt den Parser? | Details |
--x509-cert | Parser für X.509-PEM- und DER-Zertifikatdateien | Details |
--x509-csr | Parser für X.509-PEM- und DER-Zertifikatanforderungsdateien | Details |
--xml | XML-Dateiparser | Details |
--xrandr | xrandr -Befehlsparser | Details |
--yaml | YAML-Dateiparser | Details |
--zipinfo | zipinfo Befehlsparser | Details |
--zpool-iostat | zpool iostat -Befehlsparser | Details |
--zpool-status | zpool status Statusbefehlsparser | Details |
Kurz | Lang | Beschreibung |
---|---|---|
-a | --about | Über jc . Gibt Informationen über jc und die Parser aus (natürlich in JSON oder YAML!) |
-C | --force-color | Farbausgabe auch bei Verwendung von Pipes erzwingen (überschreibt -m und die Umgebungsvariable NO_COLOR ) |
-d | --debug | Debug-Modus. Gibt Ablaufverfolgungsmeldungen aus, wenn Parsing-Probleme auftreten (verwenden Sie -dd für ausführliches Debuggen). |
-h | --help | Helfen. Verwenden Sie jc -h --parser_name für die Parser-Dokumentation. Zweimal verwenden, um versteckte Parser anzuzeigen (z. B. -hh ). Dreimal verwenden, um Parser-Kategorien anzuzeigen (z. B. -hhh ). |
-m | --monochrome | Monochrome Ausgabe |
-M | --meta-out | Fügen Sie der Ausgabe Metadaten hinzu, einschließlich Zeitstempel, Parsername, Magic-Befehl, Exit-Code für Magic-Befehle usw. |
-p | --pretty | Formatieren Sie die JSON-Ausgabe hübsch |
-q | --quiet | Leiser Modus. Unterdrückt Parser-Warnmeldungen (verwenden Sie -qq , um Streaming-Parser-Fehler zu ignorieren) |
-r | --raw | Rohausgabe. Bietet mehr Literalausgabe, normalerweise mit Zeichenfolgenwerten und ohne zusätzliche semantische Verarbeitung |
-s | --slurp | Mehrere Zeilen in ein Array einfügen. (verwenden Sie -hhh , um kompatible Parser zu finden) |
-u | --unbuffer | Ausgabe entpuffern |
-v | --version | Versionsinformationen |
-y | --yaml-out | YAML-Ausgabe |
-B | --bash-comp | Generieren Sie ein Bash-Shell-Vervollständigungsskript (weitere Informationen) |
-Z | --zsh-comp | Generieren Sie ein Zsh-Shell-Vervollständigungsskript (weitere Informationen) |
Das Zeilen-Slicing wird mit der START:STOP
Syntax unterstützt, die dem Python-Slicing ähnelt. Dadurch können Sie Zeilen am Anfang und/oder Ende der STDIN
Eingabe überspringen, die jc
konvertieren soll.
START
und STOP
können positive oder negative Ganzzahlen oder Leerzeichen sein und ermöglichen Ihnen die Angabe, wie viele Zeilen übersprungen und wie viele Zeilen verarbeitet werden sollen. Positive und leere Slices sind am speichereffizientesten. Alle negativen Ganzzahlen im Slice belegen mehr Speicher.
Um beispielsweise die erste und letzte Zeile des folgenden Textes zu überspringen, können Sie den Slice auf verschiedene Arten ausdrücken:
$ 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 " }]
In diesem Beispiel liefern 1:-1
und 1:4
-Linienabschnitte die gleiche Ausgabe.
Bei Verwendung positiver Ganzzahlen ist die Indexposition von STOP
nicht inklusiv. Positive Slices zählen von der ersten Zeile der Eingabe bis zum Ende, beginnend bei 0
als erste Zeile. Negative Slices zählen von der letzten Zeile zum Anfang, beginnend bei -1
als letzte Zeile. Auf diese Weise funktioniert auch die Slicing-Funktion von Python.
Hier ist eine Aufschlüsselung der Linien-Slice-Optionen:
Slice-Notation | Eingabezeilen verarbeitet |
---|---|
START:STOP | Linien START bis STOP - 1 |
START: | Zeilen START durch den Rest der Ausgabe |
:STOP | Zeilen vom Anfang bis STOP - 1 |
-START:STOP | START Linien vom Ende bis STOP - 1 |
START:-STOP | Linien START bis STOP Linien vom Ende |
-START:-STOP | START Linien vom Ende bis STOP -Linien vom Ende |
-START: | START Zeilen vom Ende bis zum Rest der Ausgabe |
:-STOP | Zeilen vom Anfang bis STOP Zeilen vom Ende |
: | alle Zeilen |
Einige Parser unterstützen die Eingabe mehrerer Elemente und können ein Array von Ergebnissen in einem einzigen Durchgang ausgeben. Slurping funktioniert für String-Parser, die eine einzelne Eingabezeile akzeptieren. (z. B. url
und ip-address
) Um eine Liste der Parser anzuzeigen, die die Option --slurp
unterstützen, verwenden Sie jc -hhh
.
Sie können beispielsweise eine Datei mit mehreren IP-Adressen (eine pro Zeile) mit der Option --slurp
an jc
senden und eine Reihe von Ergebnissen wird ausgegeben:
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
Die magische Syntax für /proc
-Dateien unterstützt automatisch das Slurpen mehrerer Dateien (die Option --slurp
muss nicht verwendet werden). Sie können beispielsweise viele PID-Dateien gleichzeitig konvertieren:
$ jc /proc/ * /status
[ < multiple output objects > ]
Wenn die Magic-Syntax /proc
verwendet wird und mehrere Dateien ausgewählt werden, wird ein zusätzliches _file
Feld in die Ausgabe eingefügt, damit leichter erkennbar ist, auf welche Datei sich jedes Ausgabeobjekt bezieht.
Schließlich kann die Option --meta-out
in Verbindung mit der Slurped-Ausgabe verwendet werden. In diesem Fall wird die geschlürfte Ausgabe in ein Objekt mit der folgenden Struktur verpackt:
{
"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 "
]
}
}
Mit --meta-out
enthält input_list
eine Liste von Eingaben (tatsächliche Eingabezeichenfolgen oder /proc
-Dateinamen), sodass Sie identifizieren können, welches Ausgabeobjekt sich auf die einzelnen Eingabezeichenfolgen oder /proc
-Dateinamen bezieht.
Alle schwerwiegenden Fehler in jc
generieren einen Exit-Code von 100
, andernfalls ist der Exit-Code 0
.
Bei Verwendung der „magischen“ Syntax (z. B. jc ifconfig eth0
) speichert jc
den Exit-Code des zu analysierenden Programms und fügt ihn dem jc
Exit-Code hinzu. Auf diese Weise lässt sich leichter feststellen, ob ein Fehler vom analysierten Programm oder von jc
herrührt.
Betrachten Sie die folgenden Beispiele für die Verwendung von ifconfig
:
ifconfig Exit-Code | jc -Exit-Code | Kombinierter Exit-Code | Interpretation |
---|---|---|---|
0 | 0 | 0 | Keine Fehler |
1 | 0 | 1 | Fehler in ifconfig |
0 | 100 | 100 | Fehler im jc |
1 | 100 | 101 | Fehler sowohl in ifconfig als auch in jc |
Wenn Sie die „magische“ Syntax verwenden, können Sie den Exit-Code des aufgerufenen Programms auch mithilfe der Option --meta-out
oder -M
abrufen. Dadurch wird ein _jc_meta
Objekt an die Ausgabe angehängt, das die Magic-Befehlsinformationen, einschließlich des Exit-Codes, enthält.
Hier ist ein Beispiel mit 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
Sie können benutzerdefinierte Farben über die Umgebungsvariable JC_COLORS
angeben. Die Umgebungsvariable JC_COLORS
akzeptiert vier durch Kommas getrennte Zeichenfolgenwerte im folgenden Format:
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
Dabei sind die Farben: black
, red
, green
, yellow
, blue
, magenta
, cyan
, gray
, brightblack
, brightred
, brightgreen
, brightyellow
, brightblue
, brightmagenta
, brightcyan
, white
oder default
So stellen Sie beispielsweise die Standardfarben ein:
JC_COLORS=blue,brightblack,magenta,green
oder
JC_COLORS=default,default,default,default
Sie können die Umgebungsvariable NO_COLOR
auf einen beliebigen Wert setzen, um die Farbausgabe in jc
zu deaktivieren. Beachten Sie, dass die Verwendung der Option -C
zum Erzwingen der Farbausgabe sowohl die Umgebungsvariable NO_COLOR
als auch die Option -m
überschreibt.
Die meisten Parser laden alle Daten von STDIN
, analysieren sie und geben dann das gesamte JSON-Dokument seriell aus. Es gibt einige Streaming-Parser (z. B. ls-s
und ping-s
), die sofort mit der Verarbeitung und zeilenweisen Ausgabe der Daten als JSON-Zeilen (auch bekannt als NDJSON) beginnen, während sie von STDIN
empfangen werden. Dies kann den Speicherbedarf zum Parsen großer Mengen an Befehlsausgaben (z. B. ls -lR /
) erheblich reduzieren und die Daten manchmal schneller verarbeiten. Streaming-Parser verhalten sich leicht anders als Standard-Parser, wie unten beschrieben.
Hinweis: Streaming-Parser können nicht mit der „magischen“ Syntax verwendet werden
Möglicherweise möchten Sie Analysefehler ignorieren, wenn Sie Streaming-Parser verwenden, da diese möglicherweise in langlebigen Verarbeitungspipelines verwendet werden und Fehler die Pipeline beschädigen können. Um Parsing-Fehler zu ignorieren, verwenden Sie die CLI-Option -qq
oder das ignore_exceptions=True
mit der Funktion parse()
. Dadurch wird der JSON-Ausgabe ein _jc_meta
-Objekt mit einem success
hinzugefügt. Wenn success
true
ist, gab es beim Parsen der Zeile keine Probleme. Wenn success
false
ist, wurde ein Parsing-Problem gefunden und die Felder error
und line
werden hinzugefügt, um eine kurze Fehlerbeschreibung bzw. den Inhalt der nicht analysierbaren Zeile aufzunehmen:
Zeile mit der Option -qq
erfolgreich geparst:
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
Zeile mit der Option -qq
wurde nicht erfolgreich geparst:
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
Die meisten Betriebssysteme puffern die Ausgabe, die von Prozess zu Prozess weitergeleitet wird. Der Puffer ist normalerweise etwa 4 KB groß. Beim Anzeigen der Ausgabe im Terminal ist der Betriebssystempuffer nicht aktiviert, sodass die Ausgabe sofort auf dem Bildschirm angezeigt wird. Beim Zusammenführen mehrerer Prozesse kann es jedoch so aussehen, als ob die Ausgabe hängen bleibt, wenn die Eingabedaten sehr langsam sind (z. B. ping
):
$ ping 1.1.1.1 | jc --ping-s | jq
Dies liegt daran, dass das Betriebssystem in diesem Beispiel den 4-KB-Puffer zwischen jc
und jq
nutzt. Um die Daten auf dem Terminal in Echtzeit anzuzeigen, können Sie den Puffer mit der CLI-Option -u
(unbuffer) deaktivieren:
$ 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...}
...
Hinweis: Die ungepufferte Ausgabe kann bei großen Datenströmen langsamer sein.
Streaming-Parser akzeptieren jedes iterierbare Objekt und geben ein iterierbares Objekt zurück, das eine verzögerte Verarbeitung der Daten ermöglicht. Die Eingabedaten sollten über Zeilen mit Zeichenfolgendaten iterieren. Beispiele für gute Eingabedaten sind sys.stdin
oder str.splitlines()
.
Um das zurückgegebene iterierbare Objekt in Ihrem Code zu verwenden, durchlaufen Sie es einfach in einer Schleife oder verwenden Sie die integrierte Funktion next():
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
Parser-Plugins können in einem jc/jcparsers
Ordner in Ihrem lokalen „App-Datenverzeichnis“ abgelegt werden:
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
Parser-Plugins sind Standard-Python-Moduldateien. Verwenden Sie den Parser jc/parsers/foo.py
oder jc/parsers/foo_s.py (streaming)
als Vorlage und platzieren Sie einfach eine .py
Datei im Unterordner jcparsers
. Alle Abhängigkeiten können im jc
-Ordner oberhalb von jcparsers
abgelegt und in den Parser-Code importiert werden.
Parser-Plugin-Dateinamen müssen gültige Python-Modulnamen sein und müssen daher mit einem Buchstaben beginnen und ausschließlich aus alphanumerischen Zeichen und Unterstrichen bestehen. Lokale Plugins können Standardparser überschreiben.
Hinweis: Das Anwendungsdatenverzeichnis folgt der XDG-Basisverzeichnisspezifikation
Um optimale Ergebnisse zu erzielen, legen Sie die Umgebungsvariablen des Gebietsschemas auf C
oder en_US.UTF-8
fest, indem Sie die Variable LC_ALL
ändern:
$ LC_ALL=C date | jc --date
Sie können die Gebietsschemavariablen auch einzeln festlegen:
$ export LANG=C
$ export LC_NUMERIC=C
Auf einigen älteren Systemen wird die UTF-8-Ausgabe mit \u
-Escape-Sequenzen auf ASCII herabgestuft, wenn das C
Gebietsschema die UTF-8-Kodierung nicht unterstützt.
Einige Parser haben berechnete Epochen-Zeitstempelfelder zur Ausgabe hinzugefügt. Sofern ein Zeitstempelfeldname nicht das Suffix _utc
hat, gilt er als naiv. (dh basierend auf der lokalen Zeitzone des Systems, auf dem der jc
Parser ausgeführt wurde).
Wenn im Text der Befehlsausgabe eine UTC-Zeitzone erkannt werden kann, berücksichtigt der Zeitstempel die Zeitzone und weist am Schlüsselnamen das Suffix _utc
auf. (z. B. epoch_utc
) Für bewusste Zeitstempel werden keine anderen Zeitzonen unterstützt.
jc
kann in fast jeder Shell verwendet werden. Einige moderne Shells verfügen über integrierte JSON-Deserialisierungs- und Filterfunktionen, was die Verwendung von jc
noch komfortabler macht.
In NGS (Next Generation Shell) ist beispielsweise Folgendes möglich:
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
Dadurch wird jc
ausgeführt, die JSON-Ausgabe analysiert und die resultierende Datenstruktur einer Variablen in einer einzelnen Codezeile zugewiesen.
Weitere Beispiele für die Verwendung jc
in anderen Shells finden Sie auf dieser Wiki-Seite.
Einige Parser wie dig
, xml
, csv
usw. funktionieren auf jeder Plattform. Andere Parser, die plattformspezifische Ausgaben konvertieren, generieren eine Warnmeldung, wenn sie auf einer nicht unterstützten Plattform ausgeführt werden. Um alle Parser-Informationen, einschließlich der Kompatibilität, anzuzeigen, führen Sie jc -ap
aus.
Möglicherweise verwenden Sie dennoch einen Parser auf einer nicht unterstützten Plattform. Beispielsweise möchten Sie möglicherweise eine Datei mit der Linux- lsof
Ausgabe auf einem MacOS- oder Windows-Laptop analysieren. In diesem Fall können Sie die Warnmeldung mit der CLI-Option -q
oder dem Funktionsparameter quiet=True
in parse()
unterdrücken:
macOS:
cat lsof.out | jc -q --lsof
oder Windows:
type lsof.out | jc -q --lsof
Getestet am:
Fühlen Sie sich frei, Code oder Parser hinzuzufügen/zu verbessern! Sie können die Parser jc/parsers/foo.py
oder jc/parsers/foo_s.py (streaming)
als Vorlage verwenden und Ihren Parser mit einer Pull-Anfrage senden.
Weitere Informationen finden Sie in den Beitragsrichtlinien.
ifconfig-parser
Modul von KnightWhoSayNixmltodict
Modul von Martín Blechruamel.yaml
-Modul von Anthon van der Neuttrparse
-Modul von Luis Benitez Hier sind einige Beispiele für jc
Ausgaben. Weitere Beispiele finden Sie hier oder in der Parser-Dokumentation.
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 Brasilien