巨大JSONを低メモリで処理する ― jq –streamをawkへ渡す前に知っておくこと

Linux・CLI・DevOpsカテゴリを表すパンダのイラスト Linux・CLI・DevOps

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。jq公式マニュアルの--stream仕様を確認し、旧記事のJSONをawkのフィールド区切りで直接解析する壊れやすい実装を修正しました。

検証ステータス:✅ jq公式仕様確認済み

数百MB〜GB級のJSONを扱うとき、通常のjqフィルターでは入力全体を構造化してから処理するため、メモリが問題になることがあります。jq --streamはJSONをパスと葉の値へ変換し、入力を逐次処理できます。

–streamの出力を文字列分割しない

旧コードはjq -c --streamのJSON出力をawkのFSで角括弧・カンマ・引用符に分割していました。しかし、値そのものにカンマや引用符が入れば壊れます。JSONはjqに解釈させ、awkへ渡す時点で単純なTSVなどへ変換する方が安全です。

jq -r --stream '
  select(length == 2)
  | select(.[0][-1] == "status")
  | [ (.[0] | map(tostring) | join("/")), .[1] ]
  | @tsv
' input.json |
awk -F '\t' '$2 + 0 > 500 { print "[ALERT]", $1, $2 }'

この構成なら、JSON文字列のエスケープ処理をjqへ任せつつ、awkは単純な列処理だけを担当します。

jq –streamで押さえる点

  • 葉の値は基本的に[[path...], value]の形式で流れます。
  • 配列・オブジェクトの終了を示す[[path...]]形式もあるため、length == 2などで必要な形を選別します。
  • パス末尾のキーを確認すれば、巨大JSONから必要項目だけを逐次抽出できます。

HTTP取得では失敗を見逃さない

curl --fail-with-body --silent --show-error --location "$URL" |
  jq -r --stream '...'

curl -sだけではHTTPエラーを正常データのように後段へ渡す可能性があります。定期処理では終了コードを確認し、systemd/journaldへ失敗理由を残します。

awkを使わない方が簡単な場合もある

条件抽出だけならjq単独で完結できます。awkを追加する価値があるのは、既存のテキスト処理との連携や、jqで整形した行データをさらに集計したい場合です。「巨大JSONだからawkが必要」ではありません。

公式情報

この記事の更新履歴

  • 2026-09-14 追加:--stream出力をjqでTSV化してからawkへ渡す安全な例を追加。
  • 2026-09-14 変更:awkをJSONパーサーとして使う構成から、jqをパーサー・awkを行処理に限定する構成へ変更。
  • 2026-09-14 削除:内部style_prompt、本文H1、未検証ドラフト表記、JSON記号をFSで分割する壊れやすいコードを削除。

文書情報

記事タイトル
巨大JSONを低メモリで処理する ― jq –streamをawkへ渡す前に知っておくこと
作成日
更新日
Source URL
https://papanda925.com/?p=5718

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました