13
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-09-12

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

13
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?