Edited at

AWK を使って JSON の値を抽出する

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 を使うなり他の高級言語を使うなりするのが良いと思います。