
SerenityOS grep 文本搜索完全指南16 个选项、3 个退出码与 manpage 没写的隐藏细节【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity在 SerenityOS 终端里从一堆源码中捞出散落的TODO或某行配置靠的就是grep逐行读取输入用正则表达式或固定字符串匹配输出命中的行。下面先讲清每个参数改变的行为再对照源码 Userland/Utilities/grep.cpp 验证它的默认值与边界。30 秒上手第一条可运行的 grep 命令grep -n TODO notes.txt拆解-n让每行输出前带上行号TODO是模式按 BREPOSIX 基础正则解释notes.txt是目标文件。输出形如12:TODO: 处理边界情况。不写任何文件时grep把-当作标准输入流cat notes.txt | grep TODO同样成立grep.cpp#L359-L360。退出码 0 表示有匹配、1 表示没匹配、2 表示出错脚本里直接可判。grep 参数速查按用途分组的 16 个选项分组短选项长选项作用行为备注模式来源-e P--regexp P指定匹配模式可重复模式间是或关系-f F--file F从文件读取模式每行一个独立模式匹配语法-E--extended-regexp切换 ERE 语法支持 ? () {} \|-F--fixed-strings模式按纯字符串特殊字符自动加反斜杠转义-i—忽略大小写-v--invert-match选不匹配的行取反文件处理-r--recursive递归扫描未给路径时默认当前目录-a--text二进制按文本处理等价--binary-mode text-I—忽略二进制文件等价--binary-mode skip—--binary-mode M指定二进制策略只接受binary/text/skip写错直接报错输出控制-n--line-numbers输出行号-c--count输出匹配行数每个文件读完才打印一行计数—--color WHEN命中文字着色时机auto/never/always—--no-hyperlinks禁用文件超链接诊断静默-q--quiet不输出任何内容首个命中即停错误也被静默-s--no-messages抑制文件错误消息不影响退出码 2 的置位grep 源码行为拆解默认值与边界条件模式优先级-e、-f与位置参数谁先谁后三个来源按收集顺序进同一个patterns向量-e每出现一次追加一次-f逐行读入L212-L224两者都没给时第一个位置参数被当作模式抢走剩余参数才是文件列表L226-L228。⚠️-f的边界文件中间的空行也会被当作一个合法模式匹配所有行只有读到 EOF 时的空行才丢弃L216-L223。语法引擎切换BRE、ERE 与-F的真相默认走RegexPosixBasicBRE特殊字符集.^$*[\加-E换成RegexPosixExtendedERE特殊字符集.^$*?()[{\|两个常量和两条编译分支都在 L46-L47 与 L375-L389。-F不是第三种引擎而是先用escape_characters()把当前语法的所有特殊字符加反斜杠再交给对应引擎L49-L59。正则解析失败如括号不配对会打印regex parse error并以退出码 2 终止不会静默继续L237-L242。二进制判定规则NUL 字节与三态策略判定只有一条当前行是否含\0字节L309与文件扩展名、前 80 字节之类无关。三种策略binary默认命中时打印binary file 文件名 matches然后立即停止读这个文件L315-L316text-a照常逐行输出命中内容skip-I该行直接返回不匹配L246-L247。隐含细节skip判定发生在取反之前所以-v也不会把二进制行当不匹配打印出来。着色与超链接由isatty自动决定manpage 写了--color有三档但没写默认档怎么来的colored_output初值就是isatty(STDOUT_FILENO)disable_hyperlinks是它的取反L135-L137。即终端下自动给命中文字上绿色、文件名上蓝色并给路径包一层OSC 8 超链接file://URL带line_number查询参数L87-L95一旦管道或重定向全部退化为纯文本避免 ANSI 转义序列污染脚本输出。程序名别名rgrep / egrep / fgrep 是怎么生效的源码在解析参数前先看argv[0]的 basenameL120同名不同义rgrep预置-r、egrep预置-E、fgrep预置-FL124-L126。构建系统在安装时创建三个指向grep的符号链接Userland/Utilities/CMakeLists.txt#L294-L296所以它们是同一份二进制。递归扫描细节默认当前目录与./剥离-r未给路径时自动补.L351-L353遍历用DirIterator的SkipDots跳过点目录只有没显式给路径时才从输出里剥掉前导./显式路径则原样保留L338-L339。打开失败的文件会逐条报错并把退出码置 2-s只压消息不改退出码L340-L342。grep 组合拳面向真实场景的命令示例基础匹配grep -in serenity notes.txt-i忽略大小写、-n定位行号翻日志最常用的一对组合。复杂模式grep -E ^error|^warning: build.log|交替、?量词只有 ERE 支持BRE 下得逐个转义这类需求直接上-E。递归批量grep -rnI debug log /usr/src-r递归、-n行号、-I跳过二进制源码目录检索的标准三件套避免把 ELF 和 PNG 读进终端。多模式grep -e error -e fatal build.log grep -f keywords.txt docs/*.txt多个-e是或关系不必在模式里手写|关键词清单长时用-f逐行装载。静默判断grep -qs password config.ini echo 配置项存在-q首个命中就返回 0适合写进条件语句。grep 退出码速查与脚本集成退出码含义源码依据0存在匹配行SomethingMatchedL31-L351没有任何匹配NoLinesMatched同上2出错文件打不开、正则解析失败等同上典型写法if grep -q TODO src/*.c; then make clean fi⚠️ 源码注释明确写了 -qflag also silences errorsL34静默模式下退出码 2 的含义被吞掉需要区分没匹配和文件不存在的脚本别用-q。另一个输出时机细节-c的计数是在每个文件读完后才打印一行且多文件时自动带文件名前缀L320-L328-c与-q同用时什么都不输出。生态对照grep 与相邻工具的分工pgrep同样基于LibRegex但匹配对象是/proc里的进程名而非文件内容同目录的pkill、pidof负责按名杀进程和查 PID。find按文件名/属性找文件不看内容常与grep管道搭配做内容复核。sed同样逐行处理但职责是替换与改写不是过滤输出。四个工具同在 Userland/Utilities/CMakeLists.txt 的必装列表里grep的 manpage 位于 Base/usr/share/man/man1/grep.md。一句话收束grep用一份源码覆盖 BRE/ERE 双语法、固定字符串、递归、三态二进制、着色超链接另有rgrep/egrep/fgrep符号链接随叫随到。manpage 入口grep.md源码入口Userland/Utilities/grep.cpp每行行为都可对照。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考