grep是专用于文本内容搜索的命令,使用时需加引号防路径空格和特殊字符解析错误,递归搜索应配合--include、--exclude-dir及-i选项优化性能与准确性。

直接用 grep,别绕弯——它就是干这个的。其他命令像 find 或 locate 都不查文件内容,硬套只会搜错地方、白等半天。
搜单个文件:记住加引号防空格和特殊字符
路径里有空格、括号或 $ 符号时,不加引号会出错或行为异常。shell 会提前展开或误解参数。
-
grep "timeout" "config file.txt"—— 文件名含空格,必须引起来 -
grep '\$HOME' script.sh—— 美元符要转义,否则被当变量展开 -
grep -F "[ERROR]" log.txt—— 方括号是正则元字符,用-F当纯字符串搜更安全 - 漏掉引号可能报错:
grep: file.txt: No such file or directory(其实是 shell 把空格切开了)
递归搜目录:-r 是基础,但得配 --include 和 --exclude-dir
默认 grep -r 会扫所有文件,包括 .git、node_modules、二进制文件(如 .png),轻则报错 Binary file xxx matches,重则卡死。
- 只搜 Python 文件:
grep -r --include="*.py" "import os" ./src - 跳过干扰目录:
grep -r --exclude-dir=".git" --exclude-dir="venv" "DEBUG" . - 跳过所有二进制文件(推荐):
grep -rI "panic" /var/log(大写I比--binary-files=without-match简洁) - 别写
grep -r "TODO" *——*会被 shell 展开成当前目录文件列表,grep反而收不到子目录
只想要文件名:-l 选项不能少,-n 和 -i 按需叠加
grep -r "error" /var/log 默认输出匹配行,不是文件路径;你要的是“哪些文件含 error”,就得用 -l。
- 列出所有含
500的日志文件:grep -rl "500" /var/log/*.log - 忽略大小写 + 只列文件名:
grep -rli "warning" /var/log - 带行号看上下文(不用 -l):
grep -rn "connection refused" /var/log/nginx/ - 误用
grep -r "config.yml" .是在所有文件里搜字符串config.yml,不是找叫config.yml的文件——那该用find . -name "config.yml"
最常被忽略的一点:grep 对编码不敏感,遇到 UTF-8 带 BOM 或混合编码的文件,可能漏匹配或报错;生产环境若发现搜不到明明存在的关键词,先试 file 查编码,再考虑用 iconv 转换或换 ripgrep(rg)这类现代替代品。











