この記事について
この記事は、生成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で分割する壊れやすいコードを削除。
