ターミナルで「1問だけ Claude に答えてもらって、結果をそのままシェルに流したい」人向け
シェルスクリプト・cron(決まった時刻に自動実行する仕組み)・GitHub Actions など、人間が画面を見ない場所から Claude を呼んで、出てきた答えを別のコマンドにそのまま流したいときに叩く。手元のログを `grep` で絞ってから `claude -p` にパイプで流して要約させる、PR の差分を要約させて自動コメントする、みたいな自動化の核として使う
claude -p は、Claude Code をターミナルで起動するときに「対話画面を出さず、1問だけ答えて終了する」モードに切り替える起動オプションです。普段の claude はチャット画面が立ち上がって人間と会話する作りですが、-p をつけると裏方モードに変わって、答えだけを画面に吐いて即終了します。
シェルスクリプトや cron、CI から呼び出して、出てきた文字列をそのまま別のコマンドに流したい人向け。私もログ整形やコミットメッセージ自動生成で毎日叩いてます。
噛み砕くと
-p は「Claude を1回限りの自動販売機モードにするスイッチ」です。普段の claude は店員さんとの対面注文(こちらが質問→答えが返ってくる→また質問できる)。-p は券売機にコイン入れて1品出すイメージで、ボタンを押した分だけ商品が出てきて、それで終わり。会話を続けたい場合は次のコインを入れる(コマンドをもう一度叩く)必要があります。
大事なのは「Claude そのものは同じ AI」だということ。性能やモデルが落ちるわけではなく、画面のラッパーが対話用か単発用かが違うだけです。
大事な前提:Claude Code 本体のインストールと認証が済んでいる必要がある
claude -p は「すでに claude コマンドが動く状態」が出発点です。インストールしただけ、ログインしてないだけだと、-p で叩いても結局 Claude.ai か Anthropic Console の認証フローに飛ばされて止まります。
確認方法は簡単で、ターミナルで次の1行を打ちます。
$ claude auth status
「Logged in」的なメッセージが返ってくれば -p がそのまま使えます。返ってこない場合は claude auth login で先に認証を済ませてください。CI で動かす場合は claude setup-token で長期トークンを発行して環境変数に入れる運用が公式推奨です。
「ログから怪しい行だけ Claude に要約してもらう」を例に、実際の手順を見る
具体例として「アクセスログが access.log に溜まっていて、その中のエラーらしき行(500番台のステータス)だけ抜き出して、Claude に1発で要約してほしい」という場面で叩く流れを見ていきます。
ステップ1: 元のログを覗く
まずどんなファイルか確認します。
$ wc -l access.log
12453 access.log
$ head -2 access.log
192.0.2.10 - - [01/May/2026:10:14:22 +0900] "GET /index HTTP/1.1" 200 1842
192.0.2.11 - - [01/May/2026:10:14:23 +0900] "GET /api/items HTTP/1.1" 500 89
1万2千行あって、目で読むのはしんどい。500番台のエラーだけ Claude に投げたい。
ステップ2: パイプでつないで -p に流し込む
$ grep ' 5[0-9][0-9] ' access.log | claude -p "このアクセスログ全体を見て、エラーの傾向を3行で日本語要約して"
左側で500番台の行だけ抜き出し、その結果を |(パイプ)で claude -p に渡しています。Claude 側は「要約して」というプロンプトと、流れ込んできたログ本文の両方を受け取って答えます。
ステップ3: 答えがそのままターミナルに返ってくる
500番台エラーは合計147件、全体の1.2%。
うち約8割が /api/items エンドポイントで、10:14〜10:16の3分間に集中している。
リクエスト元IPは192.0.2.0/24レンジに偏っており、特定クライアントの負荷スパイクが疑われる。
これだけ。チャット画面は開かず、答えが3行ぶん吐かれてプロンプトは $ に戻ります。
ステップ4: 出てきた文字列をさらに別のコマンドに流す
-p の出力は普通のテキストとして扱えるので、ファイルに保存したり、Slack に投げたりできます。
$ grep ' 5[0-9][0-9] ' access.log | claude -p "エラーの傾向を3行で" > report.txt
ここで初心者がやりがちな勘違いがあって、claude -p は前回の会話を覚えていません。デフォルトでは「1問1答」で完結します。続けて「じゃあその IP レンジ詳しく調べて」と聞きたいなら、もう一度 claude -p を叩くか、claude -c -p(直前のセッションを引き継いで1問1答)を使います。
ステップ5: 構造化された JSON で受け取る
シェルスクリプトから扱いやすいように JSON で返してほしい場合は --output-format json を足します。
$ grep ' 5[0-9][0-9] ' access.log | claude -p "傾向を要約" --output-format json
返り値は使用トークン数・モデル名・本文を含んだ JSON 形式になり、jq などでフィールドを取り出せます。CI から呼んで「答えだけ Slack に流す」「使用ドルを別ファイルに記録する」みたいな運用がしやすくなります。
ステップ6: 履歴を残したくない場合は明示的にオフ
v2.1.x 以降の Claude Code は -p でもデフォルトで会話履歴をローカルディスクに保存します(claude -c で続きから再開できるように)。CI 環境のように残骸を残したくない場合は --no-session-persistence を足します。
$ cat access.log | claude -p "要約" --no-session-persistence
つまり claude -p は何をしてくれるのか
- やってくれる: チャット画面を開かず、1問の答えだけターミナルに吐いて終了する。パイプでログやコードを流し込める。スクリプト・cron・CI から呼べる
- やってくれる:
--output-format jsonで構造化された返り値が受け取れて、後続コマンドに繋ぎやすい - やってくれない: 前回の会話を勝手に覚えて続きから話す(直近会話を引き継ぐには
-cを併用) - やってくれない: 認証されてない状態でいきなり動く(事前に
claude auth loginまたはsetup-tokenが必要) - 意味が薄い場面: 何往復も会話してコードを書き続けたいとき。それは普通の
claude(対話モード)の方が向いている
使いどころ3シナリオ(具体題材で再現)
シナリオ1: 毎朝のログ要約を自動化したい
運営している料理ブログ(WordPress)のアクセスログから、500番台のエラーだけ毎朝7時に Claude に要約させて Slack に流す。cron に1行登録するだけで完結します。
# crontab -e で1行追加
0 7 * * * grep ' 5[0-9][0-9] ' /var/log/nginx/access.log | claude -p "エラーの傾向を3行で" --no-session-persistence | curl -X POST -d @- $SLACK_WEBHOOK
対話モードだと cron に乗らない(人間が画面を見て返事しないと進まない)ので、ここは -p 一択です。私もこのパターンで毎朝のログ確認を半自動化してます。
シナリオ2: GitHub Actions で PR 内容を自動レビュー
OSS をフォークして開発しているとき、PR を出したら GitHub Actions の中で claude -p に diff を流して「変更の意図を箇条書き要約」を吐かせ、PR コメントに自動投稿する。CI なので画面は出せず、認証は claude setup-token で発行した長期トークンを GitHub Secrets に入れて使います。
- name: Auto-summarize PR
run: |
git diff origin/main..HEAD | claude -p "この差分の変更意図を3点に要約" > summary.txt
gh pr comment ${{ github.event.pull_request.number }} --body-file summary.txt
シナリオ3: シェルから1問だけ聞いて作業に戻りたい
家計簿アプリを作っていて、SQL の構文をちょっと確認したい。チャット画面を開くほどでもない、でもブラウザに切り替えるのも面倒。そういうときに1行で完結します。
$ claude -p "PostgreSQL で月別合計を出すクエリの基本形を1つだけ教えて"
答えが返ってきたらそのままシェルに戻って作業継続。私は普段の man コマンド代わりにもこれを使っていて、地味に手数が減ります。
初心者が踏みやすい落とし穴
- 履歴が残らないと思い込む。v2.1.x 以降の Claude Code は
-pでもデフォルトで履歴をディスクに保存します。CI など残骸を残したくない環境では--no-session-persistenceを必ず明示する - 続けて質問できない。
claude -p単独は1問1答で終わり。直前の会話を踏まえて聞きたいならclaude -c -p "次の質問"の形にする(-cが直前セッションの引き継ぎ) - パイプ入力とプロンプト指定の役割分担を間違える。
cat log | claude -p "要約して"だと、log の中身が「会話の冒頭資料」、"要約して"が「指示文」になる。両方なしでcat log | claude -pだけ叩くと指示が空っぽで Claude が何をすべきか分からない返答になりがち - 巨大ファイルを丸ごとパイプで流す。Claude Code には1回に渡せる文章量の上限(コンテキスト上限)があるので、10万行のログをそのまま
catで流すと途中で切られる。grepやhead -n 1000で事前に絞るのが基本 - 認証していない状態で CI に乗せる。ローカルでは
claude auth login済みなので動くが、CI のサーバーはログインしていないので落ちる。claude setup-tokenで長期トークンを発行し、Secrets 経由で渡す - JSON 出力を生テキストと混同する。
--output-format jsonをつけると返り値全体が JSON でラップされて、答え本文は.resultフィールドの中に入る。そのままファイルに保存すると見栄えが悪いので、jq -r .resultで本文だけ抜き出す - 対話モードの方がいい場面まで
-pで粘る。コードを何往復も書き直してもらうとか、計画立てて実装させるみたいな複数ターンの作業は普通のclaude(対話モード)の方が圧倒的に楽。-pは「1問で終わる」「自動化に組み込みたい」場面に絞る
書き方
claude -p "質問や指示の文"
cat ファイル | claude -p "指示の文"
claude -p "質問" --output-format json --no-session-persistence
やってみるとこうなる
入力
$ grep ' 5[0-9][0-9] ' access.log | claude -p "このアクセスログのエラー傾向を3行で日本語要約して"
出力例
500番台エラーは合計147件、全体の1.2%。
うち約8割が /api/items エンドポイントで、10:14〜10:16の3分間に集中している。
リクエスト元IPは192.0.2.0/24レンジに偏っており、特定クライアントの負荷スパイクが疑われる。
(チャット画面は開かず、答えが標準出力に吐かれてプロンプトはシェルに戻る)
このページに出てきた言葉
- 対話画面
- 普通に <code>claude</code> を叩くと出てくる、人間と AI が交互に発言するチャット画面のこと
- パイプ(<code>|</code>)
- 左のコマンドの出力を、右のコマンドの入力にそのまま流す仕組み。<code>grep</code> の結果を <code>claude -p</code> に渡せる
- プロンプト
- AI に投げる質問・指示の文。<code>-p</code> の後ろの <code>"..."</code> 部分
- 標準出力
- コマンドが結果を吐き出す先。普通はターミナル画面、<code>></code> でファイルに保存、<code>|</code> で次のコマンドに渡せる
- セッション
- 1回の会話のかたまり。Claude Code は1セッションをファイルとして保存して、後から続きから再開できる
- cron
- Linux や Mac に標準で入っている「決まった時刻にコマンドを自動実行する仕組み」。「毎朝7時にこれを叩いて」のような予約を組める
- CI
- コードを GitHub に push したときに自動でテスト・チェックを走らせる仕組み(GitHub Actions などの総称)
- 認証
- 「私は Claude を使う権利のある契約者です」とサーバーに証明する手続き
- トークン
- パスワードの代わりにサーバーに見せる長い文字列。CI のように人間がログイン画面を操作できない場所で使う
- JSON
- プログラムが扱いやすい形式で書かれたデータ。<code>{"key": "value"}</code> のような形
- jq
- ターミナルで JSON の中から特定の項目を取り出すための定番コマンドラインツール