VanaAPI

← 文章

从一份日志开始的正则与命令行笔记

日常活儿ZH2026-10-28

终端里有一份日志,你想找出报错的行;目录里有很多文件,你只想看看哪些以 .log 结尾。这些小任务适合用正则表达式和 Shell 一行命令处理。AI 可以帮你起草,但真正值得学的是:怎样描述需求,怎样检查结果,以及什么时候先别按回车。

§ 先把任务写成一句明确的话

正则表达式是一种描述文本模式的写法;Shell 是解释并执行命令的程序。两者经常一起出现,却不是同一件事。比如,grep 负责筛选文本,正则负责说明要找什么,Shell 则负责传递参数、连接命令。

不要只问 AI“帮我写个正则”。更好的问题是:“我在 macOS 的终端中,要从当前目录的 app.log 找出包含大写 ERROR 或 WARN 的行,显示行号,只读取文件。请解释每个参数。”环境、输入、预期结果和限制越清楚,答案越容易验证。

§ 从一条只读命令开始

这个任务可以先试:grep -nE 'ERROR|WARN' app.log。

这里,-n 显示行号,-E 启用扩展正则表达式,竖线表示“或者”。单引号让 Shell 把引号内的内容作为一个参数传给 grep,而不是把竖线解释成管道。这条命令会匹配包含这些字符的行,因此 MY_ERROR 也会命中;它并不保证匹配的是完整的日志级别。

如果只想看前二十条匹配结果,可以写:grep -nE 'ERROR|WARN' app.log | head -n 20。引号外的竖线才是 Shell 管道:它把前一个命令的输出交给后一个命令。先看懂这一层,再增加条件,比直接复制复杂的一长串命令更稳妥。

§ 用正反例检查正则

假设你想找日期,可以请 AI 从 [0-9]{4}-[0-9]{2}-[0-9]{2} 开始解释。[0-9] 表示一个数字,花括号指定重复次数。这种写法能找到类似 2026-04-18 的片段,但也会接受 2026-99-99,因为格式相似不等于日期有效。

把预期写成测试样本,比反复说“不太对”更有效:

  • 应匹配:2026-04-18。
  • 不应匹配:2026-4-18,因为月份没有两位。
  • 需要说明边界:abc2026-04-18xyz 是否应该匹配。
  • 需要额外校验:2026-02-30 格式正确,但不是有效日期。

如果要求整行只能是日期,可以加上行首和行尾标记:^[0-9]{4}-[0-9]{2}-[0-9]{2}$。如果要求真实日期有效,通常应该交给日期解析工具,而不是继续堆叠正则。

§ 文件通配符不等于正则

另一个常见任务是列出日志文件:find . -type f -name '*.log' -print。这条命令从当前目录递归查找普通文件,打印名称以 .log 结尾的路径,不会删除文件。

这里的 *.log 是文件名通配模式,不是正则表达式。单引号避免 Shell 提前展开它,让 find 自己处理匹配。向 AI 提问时,可以顺便要求它指出“哪些部分是 Shell 语法,哪些是工具参数,哪些是匹配规则”,这样更容易把知识迁移到下一次任务。

§ 把 AI 当作解释者,而不是执行许可

正则方言和命令参数存在差异。适用于 Python 的表达式,不一定能直接放进 grep;依赖 GNU 工具的命令,也不一定适用于 macOS。让 AI 标明运行环境和依赖,并要求它给出最小示例。如果输入里有空格、中文、空行或特殊符号,也要加入测试。

遇到删除、覆盖、批量重命名或提权操作,先停下来。先让命令只打印将要处理的路径,再到测试目录验证。不要把输出重定向回正在读取的源文件,也不要把日志中的密钥、令牌和个人信息直接发给模型。

§ 让这套练习进入日常工具

如果你已经在使用 Claude Code、Codex、Gemini CLI 或 OpenAI SDK,可以通过 Vana API 接入模型,在熟悉的环境里提问和解释命令。它提供统一入口 https://api.vanaapi.com,兼容 OpenAI 接口,也支持 Anthropic Messages 和 Gemini 原生协议;按实际 token 用量计费,没有月费。不同工具的配置方式仍需分别确认。

你可以创建一个 Vana API 账户,从一份脱敏日志和一条只读命令开始。每次都要求 AI 给出命令、逐段解释、正反例和风险提示。目标不是记住更多符号,而是逐渐做到:看见一条命令,就知道它会读取什么、输出什么,以及有没有可能改变文件。