やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

BashでJSONファイルからJSONPathで指定したキーの値を取得する

 一応できる。処理速度は遅い。

JSONPath.sh

 JSONファイルから指定したJSONPathに該当するキーと値をTSV形式で出力するシェルスクリプト

$ JSONPath.sh -f "test.json" "$.parent.child"

["parent","child"]    "value"

test.json

{
    "parent": {
        "child": "value"
    }
}

Chromiumのユーザ名を取得する

$ /tmp/work/JSONPath.sh -f '/home/pi/.config/chromium/Default/Preferences' '$.profile.name'

["profile","name"]    "default"

 約5秒かかった。

 引数は以下の二つ。

引数 説明
-f '/home/pi/.config/chromium/Default/Preferences' 対象JSONファイル
'$.profile.name' 抽出対象を指定したJSONPath

 TSV形式で出力される。2番目の要素が値である。defaultというのが欲しかったもの。これだけを抽出したい。

値だけを抽出する

$ /tmp/work/JSONPath.sh -f '/home/pi/.config/chromium/Default/Preferences' '$.profile.name' | cut -f 2 | sed -e "s/^\"//" | sed -e "s/\"$//"

 複数行にすると以下。

$ /tmp/work/JSONPath.sh -f '/home/pi/.config/chromium/Default/Preferences' '$.profile.name' \
| cut -f 2 \
| sed -e "s/^\"//" \
| sed -e "s/\"$//"

 スクリプトファイルにすると以下。

chromium_username.sh

#!/bin/bash
Run() {
    local JSONPathSh=/tmp/work/JSONPath.sh
    local JSON="${HOME}/.config/chromium/Default/Preferences"
    local JSONPath='$.profile.name'
    echo $("${JSONPathSh}" -f "${JSON}" "${JSONPath}" | cut -f 2 | sed -e "s/^\"//" | sed -e "s/\"$//")
}
Run
コマンド 説明
${JSONPathSh} -f "${JSON}" "${JSONPath}" JSONファイルからJSONPathに該当するキーと値をTSV形式で出力する
cut -f 2 TSV形式の2列目だけを抽出する
sed -e "s/^\"//" 先頭"を削除する
sed -e "s/\"$//" 末尾"を削除する
$ time chromium_username.sh
default

 時間を測ると5秒。遅い。JSONファイルサイズは約128KB。

$ time chromium_username.sh
default

real    0m4.917s
user    0m5.253s
sys 0m0.347s