管道组合 + 结构化输出:让 Claude 和 grep 并肩作战

管道组合 + 结构化输出:让 Claude 和 grep 并肩作战

系列第 2 篇 · 读完 6 分钟 · 前置:第 1 篇 Headless 入门


上篇说了 claude -p 单次调用。但这只是"问一句,答一句"。真正的威力在于把 Claude Code 串进 Unix 工具链------让它输出机器可读的 JSON,用 jq 解析,和 grep、cat 肩并肩。


Unix 管道 30 秒速成

终端里每个命令有三个"通道":

c 复制代码
stdin(标准输入)
    ↓
[ 命令进程 ]
    ↓
stdout(标准输出)

管道 | 做的事很简单:把左边命令的 stdout 接到右边命令的 stdin:

bash 复制代码
ls src/ | grep tsx
#       ↑ 管道

左边输出的内容,变成右边读取的内容。


Claude Code 怎么接入管道

claude -p 同时从两个来源读取信息:

  • 管道 stdin:"对什么做"(数据/上下文,前置)
  • -p 参数:"做什么"(任务指令,后置)
css 复制代码
  命令A 的 stdout                    -p "做这个操作"
       │                                  │
       └──────────┬───────────────────────┘
                  ▼
        ┌─────────────────┐
        │   claude -p     │
        └────────┬────────┘
                 ▼
        终端输出 / 继续管道

三种实战模式

模式一:喂数据进来

bash 复制代码
# git diff 的输出 → Claude 审查
git diff HEAD~3 -- src/ | claude -p "审查这些代码变更,列出问题" --allowed-tools "Read"

拆解:git diff 生成变更内容,| 传给 Claude,Claude 读到 diff + 审查指令,输出问题列表。

模式二:拿结果出去

bash 复制代码
claude -p "列出所有 .tsx 文件的路径和用途" \
  --output-format json --allowed-tools "Bash,Read" | jq '.result'

--output-format json 保证输出 合法 JSON(不会带代码块标记),jq '.result' 提取 Claude 的文本回复。

模式三:两头都接

bash 复制代码
cat /tmp/app.log | \
  claude -p "分析这些日志,输出所有错误。每条一行,格式:时间|类型|严重级别。纯文本,不要 Markdown 标记。" | \
  grep "high" > critical-errors.txt

整条链路:cat 读文件 → Claude 分析 → grep 筛严重错误 → 落盘。Claude Code 成了流水线里的一环。

重要约束 :当 Claude 的输出要作为下一个命令的输入时,prompt 里必须明确要求 "纯文本,不要 Markdown 标记" 。否则 Claude 可能加 ```text 代码块标记,grep 会筛出错误结果。


结构化输出:别让 Claude 写作文

复制代码
我看到 3 个编译错误,分别在 IconCard.tsx、TimelineZone.tsx 里......

这种文本脚本没法解析------程序分不清"3"是错误数量还是其他数字。

方法一:prompt 约束 JSON

bash 复制代码
claude -p "运行 npx tsc --noEmit,根据结果输出 JSON:
{ \"errors\": 错误数, \"files\": [有问题的文件名] }
只输出 JSON,不要任何其他文字。" --allowed-tools "Bash" --max-turns 1

五个约束技巧:

约束 写法 效果
固定字段名 "errors", "files" 不会出随机 key
固定类型 <数量,数字类型> 不会是字符串 "3"
禁止废话 不要输出 JSON 以外的文字 不会破坏 JSON 结构
枚举值 true/false 二选一 不会出现第三种值
防代码块 输出的第一个字符必须是 { 或 [ 最关键的约束------阻止 Claude 加 Markdown 代码块标记(```json),加了 jq 直接报错

方法二:--json-schema

prompt 约束偶尔会失效。Claude Code 提供了原生 JSON Schema 校验------注意:仍需在 prompt 中要求输出 JSON,Schema 负责校验结构,不负责让 Claude 决定输出格式:

bash 复制代码
claude -p "检查编译错误,输出 JSON" \
  --json-schema '{"type":"object","properties":{"errors":{"type":"number"},"files":{"type":"array","items":{"type":"string"}}},"required":["errors","files"]}' \
  --allowed-tools "Bash" --max-turns 1

Schema 确保字段名、类型、必填项完全匹配你定义的规范------不会多字、不会少字、不会改 key 名。比纯 prompt 约束可靠得多。

技巧:Schema 手写麻烦时,让 Claude 帮你写:

bash 复制代码
claude -p "生成一个 JSON Schema,描述 TypeScript 编译结果:errors(数字)、files(字符串数组)、blocking(布尔)。只输出 Schema JSON。" 

方法三:--output-format json

如果同时需要业务数据 + session 元数据,用这个:

bash 复制代码
claude -p "检查编译错误" --output-format json --allowed-tools "Bash" --max-turns 1

输出是完整 session JSON,.result 字段是 Claude 的文本回复

prompt 约束 --json-schema --output-format json
可靠性 偶尔带"希望对你有帮助" Schema 强制校验 合法 JSON
业务数据 直接输出 直接输出 包在 .result 里
元数据 无 无 有
适用 简单的一次性脚本 需要保证字段结构的场景 需要监控/计费/调试

jq 五招保底

bash 复制代码
result='{"errors":3,"files":["a.tsx","b.tsx"],"blocking":true}'

echo "$result" | jq '.errors'          # 取值 → 3
echo "$result" | jq -r '.errors'       # 去引号 → 3
echo "$result" | jq '.files[]'         # 遍历数组
echo "$result" | jq '.files | length'  # 数组长度 → 2
echo "$result" | jq 'keys'             # 所有字段名

实战:编译检查 + 自动决策

bash 复制代码
#!/bin/bash
result=$(cd ~/my-project && \
  claude -p "运行 npx tsc --noEmit,输出 JSON 格式的编译结果" \
    --json-schema '{"type":"object","properties":{"errors":{"type":"number"},"blocking":{"type":"boolean"}},"required":["errors","blocking"]}' \
    --allowed-tools "Bash"  --max-turns 1)

blocking=$(echo "$result" | jq -r '.blocking')

if [ "$blocking" = "true" ]; then
  echo "❌ 编译有阻塞性错误,停止"
  exit 1
fi
echo "✅ 通过,继续..."

这里用 --json-schema 而不是 --output-format json :--json-schema 让 Claude 直接把业务数据作为输出主体,下游 jq 直接解析 .blocking,不需要从 .result 字符串里再取一层。同时 Schema 强约束了字段类型------errors 一定是数字,blocking 一定是布尔,不会有 prompt 约束那种"偶尔带废话"的风险。

现在你的脚本能根据 Claude 的分析结果做自动决策了。


下一篇:多步流水线 + 脚本实战 ------ 把复杂任务拆成多步,串成一条自动执行的流水线。

系列目录:共 4 篇,从零到把 Claude Code 嵌入自动化脚本。

相关推荐
Ward的AI产品实战4 小时前
多个订阅接多个 Agent 怎么管?我从 CC-Switch 迁移到了开源 AI 网关 Magpie(上篇)
开源·ai编程
302wanger4 小时前
Anthropic 内部报告:当 AI Agent 的工作时长是人类的 6 倍,公司还招初级工程师吗?
claude
qinglongcn4 小时前
为什么 Agent 循环是 for{} 而不是 DAG——架构选择的深层原因
agent·ai编程
小七-七牛开发者5 小时前
周一上线 | DeepSeek 开始卷“许愿式编程”,Agent 手机来了,Character.AI 申请破产
ai·大模型·agent·claude·codex·deepseek·ai coding
ServBay5 小时前
DeepSeek 小更新,许愿式编程成真了?
aigc·ai编程·deepseek
殷紫川7 小时前
Context7 :给 AI 编码代理接上实时文档的 “活水”
aigc·ai编程·mcp
孔令允7 小时前
用 VSCode + Claude Code 搭一套专利编写 AI 辅助环境
claude
桃西西呀8 小时前
我把网关限流配置成每秒 100 请求,大促一来照样被打挂,还把别人也拖垮了
人工智能·llm·ai编程
程序员天天困8 小时前
DeepSeek-V4.1-Flash-1017 上手实测:3D 直出,效果到底如何
aigc·ai编程·deepseek
OpsEye9 小时前
大模型账单对账难:不同厂商 Token 统计口径差异怎么处理
javascript·ai编程