grep命令默认逐行扫描并输出匹配整行,不显示行号、不递归子目录;常用选项包括-i(忽略大小写)、-n(显示行号)、-o(仅输出匹配部分)、-r(递归搜索)、--include(限定文件类型)、--exclude-dir(排除目录)等,配合find可实现更精确的文件筛选与内容搜索。

用 grep 快速搜索文件内容
直接在终端执行 grep 是最常用也最可靠的方式。它默认逐行扫描,匹配到就输出整行,不显示行号也不递归子目录——这点容易误以为“没找到”,其实是没加参数。
- 查当前目录所有
.log文件中含"ERROR"的行:grep "ERROR" *.log - 忽略大小写加
-i:例如grep -i "not found" /var/log/syslog - 显示行号加
-n,避免打开文件再手动定位 - 只显示匹配部分(而非整行)用
-o,适合提取 IP 或 URL 片段
递归搜索整个目录树用 grep -r
grep -r 会进入子目录,但默认跳过二进制文件;如果目标文件是日志压缩包或数据库文件,它可能静默跳过,不报错也不提示——这是常见盲区。
- 搜当前目录及子目录下所有普通文件中的
"timeout":grep -r "timeout" . - 强制搜索二进制文件(比如某些打包的日志)加
--binary-files=text - 排除特定路径用
--exclude-dir,例如跳过node_modules:grep -r --exclude-dir=node_modules "fetch" ./src - 想限制只搜某种后缀,用
--include="*.py",比find | xargs grep更简洁安全
配合 find 精确控制搜索范围
当 grep -r 不够细粒度时(比如只查最近 24 小时修改过的 JSON 文件),就得靠 find 配合 grep。注意管道传参时文件名含空格会出错,必须用 -print0 + xargs -0。
- 查过去一天修改的
.conf文件里是否有"listen 8080":find . -name "*.conf" -mtime -1 -print0 | xargs -0 grep "listen 8080" - 避免命令被截断:不用
find ... | xargs grep,改用find ... -exec grep ... {} +更稳 -
find的-path比--exclude-dir更灵活,支持通配符,如-path "./build/*" -prune可跳过构建目录
搜索结果太多时怎么快速过滤
原始 grep 输出常混着无关路径和重复内容,尤其在大型项目里。别急着导出再处理,用管道链式过滤更高效。
- 去掉警告(比如 “Permission denied”):
grep ... 2>/dev/null - 只看文件名不看内容:
grep -rl "TODO" .(-l参数) - 统计每文件匹配次数:
grep -c "import" *.py | sort -t: -k2nr - 高亮关键词又不影响后续管道处理?加
--color=never,否则颜色转义符会污染输出
真正麻烦的是正则边界——比如搜单词 "cat" 却匹配到 "concat",得用 -w 或 \bcat\b。这个细节不加,结果就不可靠。











