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