それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

コマンドの結果をJSONの配列やオブジェクトにする。- jc コマンド

コマンドの結果をいい感じに、配列にしたい

コマンドの実行結果をJSONにしたいと思った。

https://dev.classmethod.jp/articles/jc-tool/

jc コマンド

jc コマンドは、STDINを読み取って JSONに変換してくれる。

数多くのパーサーが用意されてプリインいる、パーサーがなくてもjc はそこそこ便利。

jc コマンドを試す。

$ id | jc --id --pretty

結果はJSONになる。

{
  "uid": {
    "id": 1000,
    "name": "takuya"
  },
  "gid": {
    "id": 1000,
    "name": "takuya"
  },
  "groups": [
    {
      "id": 1000,
      "name": "takuya"
    },
    {
      "id": 4,
      "name": "adm"
    }
  ]
}

プリインストールのパーサーがいっぱいある

(略
    --ls                `ls` command parser
    --ls-s              `ls` command streaming parser
    --lsblk             `lsblk` command parser
    --lsmod             `lsmod` command parser
    --lsof              `lsof` command parser
    --lsusb             `lsusb` command parser
    --nmcli             `nmcli` command parser
    --passwd            `/etc/passwd` file parser
    --ping              `ping` and `ping6` command parser
    --systemctl         `systemctl` command parser
    --systemctl-lj      `systemctl list-jobs` command parser
    --systemctl-ls      `systemctl list-sockets` command parser
    --systemctl-luf     `systemctl list-unit-files` command parser
    --systeminfo        `systeminfo` command parser
    --top               `top -b` command parser
(略

プリインなパーサがなくても大丈夫。いい感じにJSON配列になる。

サクッと行ごとに出力して

$ apt list vim* 2>/dev/null | grep vim | cut -d '/' -f 1  | sort | head -n 5
vim
vim-addon-manager
vim-addon-mw-utils
vim-airline
vim-airline-themes

jc / jq でサクッと整形する。

apt list vim* 2>/dev/null | grep vim | cut -d '/' -f 1  | sort | head -n 5 | \
    jc --kv | \
    jq keys

行ー>配列になる。

[
  "vim",
  "vim-addon-manager",
  "vim-addon-mw-utils",
  "vim-airline",
  "vim-airline-themes"
]

Key/Valueを使ってオブジェクトにする

プリインストールがないなら、脳死で考えるのをやめて キーバリューに仕立てる

Key/Valuegrep / sed /awk で作る

cat /etc/php/8.0/cli/php.ini | grep -v \; | grep = | grep session | sed 's/ = /:/'
session.save_handler:files
session.use_strict_mode:0
session.use_cookies:1
session.use_only_cookies:1
session.name:PHPSESSID
session.auto_start:0
session.cookie_lifetime:0
session.cookie_path:/
session.cookie_domain =
session.cookie_httponly =
session.cookie_samesite =
session.serialize_handler:php
session.gc_probability:0
session.gc_divisor:1000
session.gc_maxlifetime:1440
session.referer_check =
session.cache_limiter:nocache
session.cache_expire:180
session.use_trans_sid:0
session.sid_length:26
session.trans_sid_tags:"a=href,area=href,frame=src,form="
session.sid_bits_per_character:5

jc にかける

cat /etc/php/8.0/cli/php.ini | grep -v \; | grep = | grep session | sed 's/ = /:/' | jc --kv --pretty
{
  "session.save_handler": "files",
  "session.use_strict_mode": "0",
  "session.use_cookies": "1",
  "session.use_only_cookies": "1",
  "session.name": "PHPSESSID",
  "session.auto_start": "0",
  "session.cookie_lifetime": "0",
  "session.cookie_path": "/",
  "session.cookie_domain": "",
  "session.cookie_httponly": "",
  "session.cookie_samesite": "",
  "session.serialize_handler": "php",
  "session.gc_probability": "0",
  "session.gc_divisor": "1000",
  "session.gc_maxlifetime": "1440",
  "session.referer_check": "",
  "session.cache_limiter": "nocache",
  "session.cache_expire": "180",
  "session.use_trans_sid": "0",
  "session.sid_length": "26",
  "session.trans_sid_tags": "a=href,area=href,frame=src,form=",
  "session.sid_bits_per_character": "5"
}

jc コマンドでシェルの実行結果を JSONに変えられる

jc コマンドは対応コマンドはきれいにJSONに代わる。非対応のものは、--kv で Key/Value として処理すれば簡単に jq で解釈できる。

インストール

pip3 install jc

パーサーが無いコマンド

パーサーがない場合は、jc --csv jc --kvJSONにすればいいので、awk コマンドでいい感じに整形すればいい。

整形結果をフィルタするときは、 ` jc --kv | jq .で jq と組み合わせできるのでよい。