Tips

サンプルのJSONデータ

`jq`は、JSONデータをコマンドラインで柔軟に処理するための軽量で強力なパーサーです。標準入力からJSONを受け取り、フィルタリング、変換、整形などを行い、必要な情報だけを抽出・表示できます。複雑なJSON構造から特定のデータを取り出したり、可読性を高めたりする際に非常に役立ちます。

技術・言語・ツール: jq

jqは、JSONデータをコマンドラインで柔軟に処理するための軽量で強力なパーサーです。標準入力からJSONを受け取り、フィルタリング、変換、整形などを行い、必要な情報だけを抽出・表示できます。複雑なJSON構造から特定のデータを取り出したり、可読性を高めたりする際に非常に役立ちます。

複雑なJSONから必要な情報だけを抽出する jq のパス指定

APIレスポンスやログファイルなど、巨大でネストされたJSONデータから特定のフィールドの値だけを取り出したい場合、jqのパス指定が非常に強力です。ドット(.)を使ってオブジェクトのキーにアクセスし、配列の場合はインデックスまたは[]で全ての要素を反復処理できます。

# サンプルのJSONデータ
cat <<EOF > data.json
{
  "users": [
    {
      "id": 1,
      "name": "Alice",
      "email": "alice@example.com",
      "roles": ["admin", "editor"]
    },
    {
      "id": 2,
      "name": "Bob",
      "email": "bob@example.com",
      "roles": ["viewer"]
    }
  ],
  "metadata": {
    "timestamp": "2023-10-27T10:00:00Z",
    "version": "1.0"
  }
}
EOF

# 全ユーザーの名前とIDだけを抽出
cat data.json | jq '.users[] | {id: .id, name: .name}'

# 出力例:
# {
#   "id": 1,
#   "name": "Alice"
# }
# {
#   "id": 2,
#   "name": "Bob"
# }

# idが1のユーザーのメールアドレスを抽出
cat data.json | jq '.users[] | select(.id == 1) | .email'

# 出力例:
# "alice@example.com"

# 全ユーザーのロールをユニークなリストとして抽出
cat data.json | jq '[.users[].roles[]] | unique'

# 出力例:
# [
#   "admin",
#   "editor",
#   "viewer"
# ]

注意点やおすすめポイント:

  • jqは標準入力を受け取るため、curlkubectlの出力とパイプで繋いで使うと非常に強力です。
  • -rオプションを使うと、文字列を引用符なしで出力できます(例: jq -r '.users[] | select(.id == 1) | .email')。
  • --indent Nオプションで整形時のインデント数を指定したり、compactフィルタで1行表示にしたりと、出力形式も自由に制御できます。
  • 複雑なクエリを書く際は、まず一部を抽出してみて、徐々にフィルタを重ねていくとデバッグしやすいです。