jq 便利ですよね。ただインストールされていない環境も多く、jq なしで JSON の値を抽出したいとき AWK が使えるかもしれません。
単純なケース
たとえば、以下のような JSON があったとして、
$ cat users.json
{
"Alice": "alice@example.com",
"Bob": "bob@example.com",
"Carol": "carol@example.com"
}
Bob
の値 bob@example.com
が欲しいとき、次のコマンドで抽出できます。
$ awk -F\" '/"Bob"/{print $4}' users.json
bob@example.com
JSON が minify されているケース
$ cat users.min.json
{"Alice":"alice@example.com","Bob":"bob@example.com","Carol":"carol@example.com"}
組み込み変数 RS
を定義して、レコードの区切り文字を変更します。
$ awk -F\" -v RS=, '/"Bob"/{print $4}' users.min.json
bob@example.com
"
がエスケープされているケース
上記の方法では \"
のようにエスケープされた "
がキーや値に含まれるとうまく抽出できません。
$ awk -F: -v 'RS=[,\n]' '/"Bob"/{ print gensub(/^ *"(.*)",? *}?$/, "\\1", 1, $2) }' users.json
gawk に限りますが、組み込み関数の gensub
を使って抽出できました。上で挙げた全てのケースに対応しているので、これひとつ使えば OK かもしれません。
さて、ここまでして AWK で頑張る必要があるのでしょうか。私にはわかりません。
文字列以外が入ってくることは想定してないので、複雑なものは jq を使うなり他の高級言語を使うなりするのが良いと思います。