用 -w 参数可精准匹配整个单词,如 grep -w "cat" file.txt,要求前后为非单词字符或边界;严格字段匹配用 -x 配合 ^ok$;多文件搜索显示文件名和行号用 -hn;排除目录用 --exclude-dir;匹配失败时退出码为 1,需用 echo $? 检查。

grep 怎么精准匹配整个单词,避免子串误中
默认 grep 是子串匹配,搜 cat 会把 category 和 scatter 都带上。这不是你想要的“找单词”,而是“找含 cat 的任意字符串”。
用 -w 参数强制整词匹配:grep -w "cat" file.txt。它要求前后都是非单词字符(空格、换行、标点等)或边界。
- 注意
-w对下划线、数字不敏感——cat123和my_cat都不算“整个单词”,但cat_开头的可能被截断匹配,得看上下文 - 如果目标是严格等于某字段(比如日志里
status: ok中的ok),用-x配合^ok$更稳妥 - 大小写敏感默认开启,搜
ERROR不会命中Error,加-i才统一处理
grep 在多个文件里搜索并显示文件名和行号
不加任何选项时,grep pattern *.log 确实会输出文件名,但一旦只匹配到一个文件,就不再显示文件名——这是很多人困惑的点:为什么有时有 file.log: 前缀,有时没有?
强制始终显示文件名用 -H;加行号用 -n。组合起来最常用:grep -Hn "timeout" /var/log/nginx/*.log。
-
-H在单文件场景下是刚需,否则脚本解析输出时容易错位 -
-n对调试日志特别有用,但注意:行号是原始文件中的物理行号,不是过滤后结果的序号 - 如果目录层级深,直接上
grep -rn "pattern" /path/,-r递归,-n行号,-r默认带-H
grep 怎么排除某些文件或目录(比如跳过 node_modules)
grep -r 默认扫全目录,遇到 node_modules、.git 这种大目录会卡住甚至报权限错误。它本身不提供内置排除逻辑,得靠 --exclude、--exclude-dir 或管道配合 find。
推荐优先用 --exclude-dir:grep -r --exclude-dir="node_modules" --exclude-dir=".git" "fetch" ./src/。
-
--exclude-dir只作用于目录名,不支持通配符("node_*"无效),也不能写路径如"./node_modules" -
--exclude="*.min.js"可用于跳过特定文件,但只对当前层生效;深层目录里的dist/*.min.js还是会被扫到 - 真要复杂过滤(比如按路径深度、修改时间),老实用
find ./src -name "*.js" -not -path "./src/node_modules/*" -exec grep -l "fetch" {} +
grep 匹配失败却没报错,怎么确认是不是真没找到
grep 找不到内容时退出码是 1,但终端不显示任何提示——看起来像“卡住”或“执行了但没输出”,新手常以为命令坏了。
检查方式很简单:执行完立刻敲 echo $?。返回 0 表示找到了,1 表示没找到,2 才是出错了(比如文件不存在、权限不够)。
- 脚本里务必判断退出码,别只靠输出是否为空。例如:
if grep -q "ready" /tmp/status; then echo "OK"; fi,-q静默但保留退出码 -
grep的stderr只吐真实错误(如No such file or directory),匹配不到不会进stderr,所以重定向2>/dev/null不影响逻辑判断 - 有些环境(比如 CI)会把
grep退出码为1当成失败,需显式用|| true或改用! grep ...取反逻辑
真正难的不是记住参数,而是理解 grep 的退出码语义、路径匹配粒度、以及它和 shell 通配符/正则引擎的分工边界——这些地方一混淆,问题就藏得深,还不好复现。










