開発者向けの
jc
Python パッケージのドキュメントを確認してください。
jc
Web デモと REST API を試してみる
jc
、community.general
コレクションの Ansible フィルター プラグインとして利用できます。例については、このブログ投稿を参照してください。
JSON変換
jc
スクリプトでの解析を容易にするために、多くの CLI ツール、ファイル タイプ、一般的な文字列の出力を JSON 化します。サポートされているコマンド、ファイル タイプ、文字列については、 「パーサー」セクションを参照してください。
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 }]
これにより、コマンドをパイプすることにより、 jq
やjello
などのツールを使用して出力をさらにコマンドラインで処理できるようになります。
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
または、代替の「マジック」構文を使用します。
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
Python ライブラリとしても使用できます。この場合、戻り値は、JSON ではなく、Python 辞書、辞書のリスト、または辞書の遅延反復可能です。
> >> 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' }]
jc
Python パッケージのドキュメントについては、help('jc')
、help('jc.lib')
を使用するか、オンライン ドキュメントを参照してください。
データの 2 つの表現が利用可能です。デフォルトの表現では、パーサーごとに厳密なスキーマが使用され、既知の数値が int/float JSON 値に変換されます。特定の既知のNone
値は JSON null
に変換され、既知のブール値は変換され、場合によっては追加のセマンティック コンテキスト フィールドが追加されます。
生の前処理された JSON にアクセスするには、 jc
Python ライブラリとして使用する場合、 -r
cli オプションまたはparse()
のraw=True
関数パラメーターを使用します。
各パーサーのスキーマは、以下の各パーサーの横にあるドキュメント リンクにあります。
リリース ノートは、Github のリリース セクションにあります。
このプロジェクトの動機の詳細については、Unix 哲学を 21 世紀にもたらすに関する私のブログ投稿および Console とのインタビューを参照してください。
以下も参照してください。
使用例:
jc
取得するにはいくつかの方法があります。 pip
、OS パッケージ リポジトリを介してインストールすることも、アーキテクチャに適したバイナリをダウンロードしてファイル システム上の任意の場所で実行することによってもインストールできます。
pip3 install jc
OS | 指示 |
---|---|
Debian/Ubuntu Linux | apt-get install jc |
Fedora Linux | dnf install jc |
openSUSE Linux | zypper install jc |
アーチリナックス | pacman -S jc |
NixOS Linux | nix-env -iA nixpkgs.jc またはnix-env -iA nixos.jc |
Guix システム Linux | guix install jc |
Gentoo Linux | emerge dev-python/jc |
フォトンリナックス | tdnf install jc |
macOS | brew install jc |
FreeBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Ansibleフィルタープラグイン | ansible-galaxy collection install community.general |
FortiSOAR コネクタ | FortiSOAR コネクタ マーケットプレイスからインストールする |
その他の OS パッケージについては、https://repology.org/project/jc/versions を参照してください。
プリコンパイルされたバイナリについては、Github のリリースを参照してください。
jc
STDIN
からのパイプ入力を受け入れ、前のコマンドの出力の JSON 表現をSTDOUT
に出力します。
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
あるいは、変換するコマンドの先頭にjc
追加するか、Proc ファイルの絶対パスの前に「マジック」構文を追加することによって、「マジック」構文を使用することもできます。オプションは、コマンドまたは Proc ファイルのパスが指定される直前にjc
に渡すことができます。 (注: コマンドエイリアスとシェルビルトインはサポートされていません)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
JSON 出力は、コンパクト (デフォルト) にすることも、 -p
オプションを使用して整形式にすることもできます。
口論 | コマンドまたはファイルタイプ | ドキュメント |
---|---|---|
--acpi | acpi コマンドパーサー | 詳細 |
--airport | airport -I コマンドパーサー | 詳細 |
--airport-s | airport -s コマンドパーサー | 詳細 |
--apt-cache-show | apt-cache show コマンドパーサー | 詳細 |
--apt-get-sqq | apt-get -sqq コマンドパーサー | 詳細 |
--arp | arp コマンドパーサー | 詳細 |
--asciitable | ASCII および Unicode テーブル パーサー | 詳細 |
--asciitable-m | 複数行の ASCII および Unicode テーブル パーサー | 詳細 |
--blkid | blkid コマンドパーサー | 詳細 |
--bluetoothctl | bluetoothctl コマンドパーサー | 詳細 |
--cbt | cbt (Google Bigtable) コマンド パーサー | 詳細 |
--cef | CEF文字列パーサー | 詳細 |
--cef-s | CEF文字列ストリーミングパーサー | 詳細 |
--certbot | certbot コマンドパーサー | 詳細 |
--chage | chage --list コマンドパーサー | 詳細 |
--cksum | cksum およびsum コマンド パーサー | 詳細 |
--clf | 共通および複合ログ形式ファイルパーサー | 詳細 |
--clf-s | 共通および複合ログ形式ファイル ストリーミング パーサー | 詳細 |
--crontab | crontab コマンドとファイルパーサー | 詳細 |
--crontab-u | ユーザーサポート付きのcrontab ファイルパーサー | 詳細 |
--csv | CSVファイルパーサー | 詳細 |
--csv-s | CSVファイルストリーミングパーサー | 詳細 |
--curl-head | curl --head コマンドパーサー | 詳細 |
--date | date コマンドパーサー | 詳細 |
--datetime-iso | ISO 8601 日時文字列パーサー | 詳細 |
--debconf-show | debconf-show コマンドパーサー | 詳細 |
--df | df コマンドパーサー | 詳細 |
--dig | dig コマンドパーサー | 詳細 |
--dir | dir コマンドパーサー | 詳細 |
--dmidecode | dmidecode コマンドパーサー | 詳細 |
--dpkg-l | dpkg -l コマンドパーサー | 詳細 |
--du | du コマンドパーサー | 詳細 |
--efibootmgr | efibootmgr コマンド パーサー | 詳細 |
--email-address | 電子メールアドレス文字列パーサー | 詳細 |
--env | env コマンドパーサー | 詳細 |
--ethtool | ethtool コマンドパーサー | 詳細 |
--file | file コマンドパーサー | 詳細 |
--find | コマンドパーサーをfind | 詳細 |
--findmnt | findmnt コマンドパーサー | 詳細 |
--finger | finger コマンドパーサー | 詳細 |
--free | free コマンドパーサー | 詳細 |
--fstab | /etc/fstab ファイルパーサー | 詳細 |
--git-log | git log コマンドパーサー | 詳細 |
--git-log-s | git log コマンド ストリーミング パーサー | 詳細 |
--git-ls-remote | git ls-remote コマンドパーサー | 詳細 |
--gpg | gpg --with-colons コマンド パーサー | 詳細 |
--group | /etc/group ファイルパーサー | 詳細 |
--gshadow | /etc/gshadow ファイルパーサー | 詳細 |
--hash | hash コマンドパーサー | 詳細 |
--hashsum | ハッシュサム コマンド パーサー ( md5sum 、 shasum など) | 詳細 |
--hciconfig | hciconfig コマンドパーサー | 詳細 |
--history | history コマンドパーサー | 詳細 |
--host | host コマンドパーサー | 詳細 |
--hosts | /etc/hosts ファイルパーサー | 詳細 |
--http-headers | HTTPヘッダーパーサー | 詳細 |
--id | id コマンドパーサー | 詳細 |
--ifconfig | ifconfig コマンドパーサー | 詳細 |
--ini | INI ファイルパーサー | 詳細 |
--ini-dup | 重複キーファイルパーサーを使用したINI | 詳細 |
--iostat | iostat コマンドパーサー | 詳細 |
--iostat-s | iostat コマンド ストリーミング パーサー | 詳細 |
--ip-address | IPv4 および IPv6 アドレス文字列パーサー | 詳細 |
--ipconfig | ipconfig Windows コマンドパーサー | 詳細 |
--iptables | iptables コマンドパーサー | 詳細 |
--ip-route | ip route コマンド パーサー | 詳細 |
--iw-scan | iw dev [device] scan コマンド パーサー | 詳細 |
--iwconfig | iwconfig コマンドパーサー | 詳細 |
--jar-manifest | Java MANIFEST.MF ファイル パーサー | 詳細 |
--jobs | jobs コマンドパーサー | 詳細 |
--jwt | JWT文字列パーサー | 詳細 |
--kv | キー/値ファイルと文字列パーサー | 詳細 |
--kv-dup | 重複キーファイルと文字列パーサーを使用したキー/値 | 詳細 |
--last | last およびlastb コマンド パーサー | 詳細 |
--ls | ls コマンドパーサー | 詳細 |
--ls-s | ls コマンド ストリーミング パーサー | 詳細 |
--lsattr | lsattr コマンドパーサー | 詳細 |
--lsb-release | lsb_release コマンドパーサー | 詳細 |
--lsblk | lsblk コマンドパーサー | 詳細 |
--lsmod | lsmod コマンドパーサー | 詳細 |
--lsof | lsof コマンドパーサー | 詳細 |
--lspci | lspci -mmv コマンドパーサー | 詳細 |
--lsusb | lsusb コマンドパーサー | 詳細 |
--m3u | M3U および M3U8 ファイル パーサー | 詳細 |
--mdadm | mdadm コマンドパーサー | 詳細 |
--mount | mount コマンドパーサー | 詳細 |
--mpstat | mpstat コマンドパーサー | 詳細 |
--mpstat-s | mpstat コマンド ストリーミング パーサー | 詳細 |
--needrestart | needrestart -b コマンドパーサー | 詳細 |
--netstat | netstat コマンドパーサー | 詳細 |
--nmcli | nmcli コマンドパーサー | 詳細 |
--nsd-control | nsd-control コマンドパーサー | 詳細 |
--ntpq | ntpq -p コマンドパーサー | 詳細 |
--openvpn | openvpn-status.log ファイル パーサー | 詳細 |
--os-prober | os-prober コマンドパーサー | 詳細 |
--os-release | /etc/os-release ファイルパーサー | 詳細 |
--pacman | pacman コマンドパーサー | 詳細 |
--passwd | /etc/passwd ファイルパーサー | 詳細 |
--path | POSIX パス文字列パーサー | 詳細 |
--path-list | POSIX パス リスト文字列パーサー | 詳細 |
--pci-ids | pci.ids ファイルパーサー | 詳細 |
--pgpass | PostgreSQL パスワード ファイル パーサー | 詳細 |
--pidstat | pidstat -H コマンドパーサー | 詳細 |
--pidstat-s | pidstat -H コマンド ストリーミング パーサー | 詳細 |
--ping | ping およびping6 コマンド パーサー | 詳細 |
--ping-s | ping およびping6 コマンド ストリーミング パーサー | 詳細 |
--pip-list | pip list コマンドパーサー | 詳細 |
--pip-show | pip show コマンドパーサー | 詳細 |
--pkg-index-apk | Alpine Linux パッケージ インデックス ファイル パーサー | 詳細 |
--pkg-index-deb | Debian パッケージ インデックス ファイル パーサー | 詳細 |
--plist | PLIST ファイルパーサー | 詳細 |
--postconf | postconf -M コマンドパーサー | 詳細 |
--proc | /proc/ ファイルパーサー | 詳細 |
--ps | ps コマンドパーサー | 詳細 |
--resolve-conf | /etc/resolve.conf ファイルパーサー | 詳細 |
--route | route コマンドパーサー | 詳細 |
--rpm-qi | rpm -qi コマンドパーサー | 詳細 |
--rsync | rsync コマンドパーサー | 詳細 |
--rsync-s | rsync コマンド ストリーミング パーサー | 詳細 |
--semver | セマンティック バージョン文字列パーサー | 詳細 |
--sfdisk | sfdisk コマンドパーサー | 詳細 |
--shadow | /etc/shadow ファイルパーサー | 詳細 |
--srt | SRT ファイルパーサー | 詳細 |
--ss | ss コマンドパーサー | 詳細 |
--ssh-conf | ssh 構成ファイルとssh -G コマンド パーサー | 詳細 |
--sshd-conf | sshd 構成ファイルとsshd -T コマンド パーサー | 詳細 |
--stat | stat コマンドパーサー | 詳細 |
--stat-s | stat コマンド ストリーミング パーサー | 詳細 |
--swapon | swapon コマンドパーサー | 詳細 |
--sysctl | sysctl コマンドパーサー | 詳細 |
--syslog | Syslog RFC 5424 文字列パーサー | 詳細 |
--syslog-s | Syslog RFC 5424 文字列ストリーミング パーサー | 詳細 |
--syslog-bsd | Syslog RFC 3164 文字列パーサー | 詳細 |
--syslog-bsd-s | Syslog RFC 3164 文字列ストリーミング パーサー | 詳細 |
--systemctl | systemctl コマンドパーサー | 詳細 |
--systemctl-lj | systemctl list-jobs コマンドパーサー | 詳細 |
--systemctl-ls | systemctl list-sockets コマンドパーサー | 詳細 |
--systemctl-luf | systemctl list-unit-files コマンドパーサー | 詳細 |
--systeminfo | systeminfo コマンドパーサー | 詳細 |
--time | /usr/bin/time コマンドパーサー | 詳細 |
--timedatectl | timedatectl status コマンドパーサー | 詳細 |
--timestamp | Unix エポック タイムスタンプ文字列パーサー | 詳細 |
--toml | TOML ファイルパーサー | 詳細 |
--top | top -b コマンドパーサー | 詳細 |
--top-s | top -b コマンド ストリーミング パーサー | 詳細 |
--tracepath | tracepath およびtracepath6 コマンドパーサー | 詳細 |
--traceroute | traceroute およびtraceroute6 コマンド パーサー | 詳細 |
--tune2fs | tune2fs -l コマンドパーサー | 詳細 |
--udevadm | udevadm info コマンドパーサー | 詳細 |
--ufw | ufw status コマンドパーサー | 詳細 |
--ufw-appinfo | ufw app info [application] コマンド パーサー | 詳細 |
--uname | uname -a コマンドパーサー | 詳細 |
--update-alt-gs | update-alternatives --get-selections コマンド パーサー | 詳細 |
--update-alt-q | update-alternatives --query コマンド パーサー | 詳細 |
--upower | upower コマンドパーサー | 詳細 |
--uptime | uptime コマンドパーサー | 詳細 |
--url | URL文字列パーサー | 詳細 |
--ver | バージョン文字列パーサー | 詳細 |
--veracrypt | veracrypt コマンド パーサー | 詳細 |
--vmstat | vmstat コマンド パーサー | 詳細 |
--vmstat-s | vmstat コマンド ストリーミング パーサー | 詳細 |
--w | w コマンドパーサー | 詳細 |
--wc | wc コマンドパーサー | 詳細 |
--wg-show | wg show コマンドパーサー | 詳細 |
--who | who コマンドパーサー | 詳細 |
--x509-cert | X.509 PEM および DER 証明書ファイル パーサー | 詳細 |
--x509-csr | X.509 PEM および DER 証明書要求ファイル パーサー | 詳細 |
--xml | XMLファイルパーサー | 詳細 |
--xrandr | xrandr コマンドパーサー | 詳細 |
--yaml | YAML ファイルパーサー | 詳細 |
--zipinfo | zipinfo コマンドパーサー | 詳細 |
--zpool-iostat | zpool iostat コマンドパーサー | 詳細 |
--zpool-status | zpool status コマンドパーサー | 詳細 |
短い | 長さ | 説明 |
---|---|---|
-a | --about | jc について。 jc とパーサーに関する情報を出力します (もちろん、JSON または YAML で!) |
-C | --force-color | パイプを使用している場合でもカラー出力を強制します ( -m およびNO_COLOR 環境変数をオーバーライドします) |
-d | --debug | デバッグモード。解析の問題が発生した場合はトレース メッセージを出力します (詳細なデバッグには-dd を使用します)。 |
-h | --help | ヘルプ。パーサーのドキュメントについては、 jc -h --parser_name を使用してください。非表示のパーサー (例: -hh ) を表示するには、2 回使用します。パーサー カテゴリを表示するには 3 回使用します (例: -hhh )。 |
-m | --monochrome | モノクロ出力 |
-M | --meta-out | タイムスタンプ、パーサー名、マジック コマンド、マジック コマンド終了コードなどのメタデータを出力に追加します。 |
-p | --pretty | JSON 出力を適切な形式に整形する |
-q | --quiet | 静かモード。パーサー警告メッセージを抑制します (ストリーミング パーサー エラーを無視するには-qq を使用します) |
-r | --raw | 生の出力。通常は文字列値を使用し、追加のセマンティック処理を行わずに、よりリテラルな出力を提供します。 |
-s | --slurp | 複数の行を配列に丸めて入れます。 (互換性のあるパーサーを見つけるには-hhh を使用します) |
-u | --unbuffer | 出力のバッファリングを解除する |
-v | --version | バージョン情報 |
-y | --yaml-out | YAML出力 |
-B | --bash-comp | Bash シェル完了スクリプトを生成する (詳細) |
-Z | --zsh-comp | Zsh シェル完了スクリプトを生成する (詳細) |
行スライスは、Python スライスと同様のSTART:STOP
構文を使用してサポートされます。これにより、 jc
に変換させたいSTDIN
入力の先頭および/または末尾の行をスキップできます。
START
とSTOP
正または負の整数、または空白を指定でき、スキップする行数と処理する行数を指定できます。正のスライスと空のスライスが最もメモリ効率が高くなります。スライス内の負の整数は、より多くのメモリを使用します。
たとえば、次のテキストの最初と最後の行をスキップするには、いくつかの方法でスライスを表現できます。
$ 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 " }]
この例では、 1:-1
と1:4
ライン スライスが同じ出力を提供します。
正の整数を使用する場合、 STOP
のインデックス位置は包括的ではありません。正のスライスは、入力の最初の行から最後に向かって最初の行として0
からカウントされます。ネガティブ スライスは、最後の行として-1
から始まり、最後の行から先頭に向かってカウントされます。これは、Python のスライス機能の動作方法でもあります。
ラインスライスオプションの内訳は次のとおりです。
スライス表記 | 処理された入力行 |
---|---|
START:STOP | 行START からSTOP - 1 |
START: | 行START から残りの出力まで |
:STOP | 先頭からSTOP - 1 までの行 |
-START:STOP | 最後から STOP までのSTART 行STOP - 1 |
START:-STOP | START 行からSTOP 行まで末尾から |
-START:-STOP | START 行を最後から、 STOP 行を最後から |
-START: | 出力の最後から残りの部分までのSTART 行 |
:-STOP | 先頭からの行から最後までのSTOP 行まで |
: | 全行 |
一部のパーサーは複数項目の入力をサポートし、単一パスで結果の配列を出力できます。 Slurping は、単一行の入力を受け入れる文字列パーサーに対して機能します。 (例: url
とip-address
) --slurp
オプションをサポートするパーサーのリストを表示するには、 jc -hhh
を使用します。
たとえば、 --slurp
オプションを使用して複数の IP アドレス (1 行に 1 つ) を持つファイルをjc
に送信すると、結果の配列が出力されます。
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
/proc
ファイルのマジック構文は、複数のファイルの丸呑みを自動的にサポートします ( --slurp
オプションを使用する必要はありません)。たとえば、多くの PID ファイルを一度に変換できます。
$ jc /proc/ * /status
[ < multiple output objects > ]
/proc
マジック構文が使用され、複数のファイルが選択されている場合、追加の_file
フィールドが出力に挿入されるため、各出力オブジェクトがどのファイルを参照しているのかが簡単にわかります。
最後に、 --meta-out
オプションは、丸呑み出力と組み合わせて使用できます。この場合、丸呑みされた出力は次の構造のオブジェクトでラップされます。
{
"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 "
]
}
}
--meta-out
使用すると、 input_list
は入力 (実際の入力文字列または/proc
ファイル名) のリストが含まれるため、どの出力オブジェクトが各入力文字列または/proc
ファイル名に関連するかを識別できます。
jc
内の致命的なエラーは終了コード100
を生成します。それ以外の場合、終了コードは0
になります。
「マジック」構文 (例: jc ifconfig eth0
) を使用する場合、 jc
解析中のプログラムの終了コードを保存し、それをjc
終了コードに追加します。こうすることで、エラーが解析されたプログラムによるものなのか、 jc
によるものなのかを判断しやすくなります。
ifconfig
を使用した次の例を考えてみましょう。
ifconfig 終了コード | jc 終了コード | 結合された終了コード | 解釈 |
---|---|---|---|
0 | 0 | 0 | エラーなし |
1 | 0 | 1 | ifconfig のエラー |
0 | 100 | 100 | jc のエラー |
1 | 100 | 101 | ifconfig とjc 両方でエラーが発生しました |
「マジック」構文を使用する場合、 --meta-out
または-M
オプションを使用して、呼び出されたプログラムの終了コードを取得することもできます。これにより、終了コードを含むマジック コマンド情報を含む出力に_jc_meta
オブジェクトが追加されます。
以下は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
JC_COLORS
環境変数を介してカスタム色を指定できます。 JC_COLORS
環境変数は、次の形式の 4 つのカンマ区切り文字列値を受け取ります。
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
色は次のとおりです: black
、 red
、 green
、 yellow
、 blue
、 magenta
、 cyan
、 gray
、 brightblack
、 brightred
、 brightgreen
、 brightyellow
、 brightblue
、 brightmagenta
、 brightcyan
、 white
、またはdefault
たとえば、デフォルトの色に設定するには:
JC_COLORS=blue,brightblack,magenta,green
または
JC_COLORS=default,default,default,default
NO_COLOR
環境変数を任意の値に設定して、 jc
でのカラー出力を無効にすることができます。 -C
オプションを使用してカラー出力を強制すると、 NO_COLOR
環境変数と-m
オプションの両方がオーバーライドされることに注意してください。
ほとんどのパーサーは、 STDIN
からすべてのデータをロードして解析し、JSON ドキュメント全体をシリアルに出力します。一部のストリーミング パーサー (例: ls-s
やping-s
) は、 STDIN
からデータを受信している間にすぐに処理を開始し、データを 1 行ずつ JSON ライン (別名 NDJSON) として出力します。これにより、大量のコマンド出力 (例: ls -lR /
) を解析するために必要なメモリ量が大幅に削減され、場合によってはデータをより迅速に処理できるようになります。以下に概説するように、ストリーミング パーサーの動作は標準パーサーとは若干異なります。
注: ストリーミング パーサーは「magic」構文では使用できません。
ストリーミング パーサーは存続期間の長い処理パイプラインで使用される可能性があり、エラーによってパイプが破損する可能性があるため、ストリーミング パーサーを使用する場合は、解析エラーを無視することをお勧めします。解析エラーを無視するには、 parse()
関数で-qq
cli オプションを使用するか、 ignore_exceptions=True
引数を使用します。これにより、 success
属性を持つ_jc_meta
オブジェクトが JSON 出力に追加されます。 success
がtrue
の場合、行の解析に問題はありませんでした。 success
がfalse
の場合は、解析の問題が見つかったので、短いエラーの説明と解析できない行の内容をそれぞれ含めるために、 error
フィールドとline
フィールドが追加されます。
-qq
オプションを使用して行が正常に解析されました:
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
-qq
オプションを使用した行の解析に失敗しました:
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
ほとんどのオペレーティング システムは、プロセス間でパイプされる出力をバッファーします。バッファーは通常約 4KB です。端末で出力を表示する場合、OS バッファは使用されないため、出力はすぐに画面に表示されます。ただし、複数のプロセスを一緒にパイプする場合、入力データが非常に遅い場合 (例: ping
)、出力がハングしているように見える場合があります。
$ ping 1.1.1.1 | jc --ping-s | jq
これは、この例では OS がjc
とjq
間で 4KB バッファを使用するためです。端末上にリアルタイムでデータを表示するには、 -u
(バッファ解除) cli オプションを使用してバッファを無効にします。
$ 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...}
...
注: 大きなデータ ストリームの場合、バッファなしの出力は遅くなる可能性があります。
ストリーミング パーサーは、任意の反復可能オブジェクトを受け入れ、反復可能オブジェクトを返し、データの遅延処理を可能にします。入力データは文字列データの行を反復する必要があります。適切な入力データの例は、 sys.stdin
またはstr.splitlines()
です。
返された反復可能オブジェクトをコード内で使用するには、それをループするか、 next() 組み込み関数を使用します。
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
パーサー プラグインは、ローカルの「アプリ データ ディレクトリ」のjc/jcparsers
フォルダーに配置できます。
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
パーサー プラグインは、標準の Python モジュール ファイルです。 jc/parsers/foo.py
またはjc/parsers/foo_s.py (streaming)
パーサーをテンプレートとして使用し、 .py
ファイルをjcparsers
サブフォルダーに配置するだけです。依存関係はすべてjcparsers
上のjc
フォルダーに配置でき、パーサー コードにインポートできます。
パーサー プラグインのファイル名は有効な Python モジュール名である必要があるため、文字で始まり、完全に英数字とアンダースコアで構成されている必要があります。ローカル プラグインはデフォルトのパーサーをオーバーライドする場合があります。
注: アプリケーション データ ディレクトリは、XDG ベース ディレクトリ仕様に従います。
最良の結果を得るには、 LC_ALL
変数を変更して、ロケール環境変数をC
またはen_US.UTF-8
に設定します。
$ LC_ALL=C date | jc --date
ロケール変数を個別に設定することもできます。
$ export LANG=C
$ export LC_NUMERIC=C
一部の古いシステムでは、 C
ロケールが UTF-8 エンコーディングをサポートしていない場合、UTF-8 出力は\u
エスケープ シーケンスを使用して ASCII にダウングレードされます。
一部のパーサーでは、計算されたエポック タイムスタンプ フィールドが出力に追加されます。タイムスタンプ フィールド名に_utc
接尾辞が付いていなければ、それは単純であるとみなされます。 (つまり、 jc
パーサーが実行されたシステムのローカル タイムゾーンに基づきます)。
コマンド出力のテキストで UTC タイムゾーンが検出できる場合、タイムスタンプはタイムゾーンを認識し、キー名に_utc
サフィックスが付きます。 (例: epoch_utc
) 他のタイムゾーンは、対応するタイムスタンプとしてサポートされません。
jc
ほとんどのシェルで使用できます。最新のシェルには、JSON 逆シリアル化機能とフィルタリング機能が組み込まれているため、 jc
の使用がさらに便利になります。
たとえば、NGS (Next Generation Shell) では次のことが可能です。
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
これにより、 jc
が実行され、出力 JSON が解析され、結果のデータ構造が 1 行のコードで変数に割り当てられます。
他のシェルでjc
使用する方法のその他の例については、この Wiki ページを参照してください。
dig
、 xml
、 csv
などの一部のパーサーは、どのプラットフォームでも動作します。プラットフォーム固有の出力を変換する他のパーサーは、サポートされていないプラットフォームで実行されると警告メッセージを生成します。互換性を含むすべてのパーサー情報を表示するには、 jc -ap
を実行します。
サポートされていないプラットフォームでもパーサーを使用することができます。たとえば、macOS または Windows ラップトップ上で linux lsof
出力を含むファイルを解析したい場合があります。その場合、 -q
cli オプションまたはparse()
のquiet=True
関数パラメータを使用して警告メッセージを抑制できます。
macOS:
cat lsof.out | jc -q --lsof
または Windows:
type lsof.out | jc -q --lsof
テスト対象:
コードやパーサーを自由に追加/改善してください。 jc/parsers/foo.py
またはjc/parsers/foo_s.py (streaming)
パーサーをテンプレートとして使用し、プル リクエストでパーサーを送信できます。
詳細については、貢献ガイドラインを参照してください。
ifconfig-parser
モジュールxmltodict
モジュール by Martín Blechruamel.yaml
モジュールtrparse
モジュール by Luis Benitezjc
出力の例をいくつか示します。その他の例については、ここまたはパーサーのドキュメントを参照してください。
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 ケリー ブラジル