grep是linux下查找文件中指定字符串的首选工具,支持大小写敏感匹配、行号显示、递归搜索、正则表达式及管道组合等核心功能。

用 grep 查找含指定字符串的行最直接
Linux 下查文件里带某字符的行,grep 是首选工具,它默认逐行扫描、输出匹配行。注意它区分大小写,且不递归进子目录——这点常被忽略。
- 基础用法:
grep "hello" file.txt(查file.txt中含hello的行) - 忽略大小写加
-i:如grep -i "ERROR" /var/log/syslog - 显示行号加
-n:方便定位,grep -n "timeout" config.conf - 只显示匹配部分(非整行)用
-o,比如grep -o "http://[^[:space:]]*" log.txt提取所有 URL
查多个文件或目录要用 -r,但得小心路径和权限
grep -r 能递归搜索整个目录树,但默认会报错跳过无权限目录(比如 /root),也可能混入二进制文件的乱码输出。
- 安全递归搜索当前目录下所有
.py文件:grep -r "def main" --include="*.py" . - 跳过二进制文件加
--binary-files=without-match - 静默权限错误加
2>/dev/null,如grep -r "TODO" . 2>/dev/null - 想排除某个子目录(比如
node_modules):grep -r "fetch" --exclude-dir=node_modules .
正则表达式匹配要转义或用 -E,否则点号星号没效果
默认 grep 是基础正则(BRE),.、+、?、| 这些元字符不生效;直接写 grep "a.b" 会字面匹配 a.b,不是“a 和 b 之间任意一个字符”。
- 启用扩展正则用
-E:grep -E "a.b|c.d" file才能正确匹配 - 或者用反斜杠转义:
grep "a\.b" file(匹配字面的a.b) - 查以数字开头的行:
grep "^[0-9]" data.csv(^和$在 BRE 中无需转义) - 避免误匹配单词的一部分,加
-w:如grep -w "cat" text.txt不会匹配category
查完想高亮或统计?别硬记选项,用管道组合更灵活
grep 本身支持 --color 高亮,但颜色在脚本里可能失效;统计行数也容易漏掉空行或重复。不如用管道交给更专一的命令处理。
- 高亮并保持可读性:
grep --color=always "fail" /var/log/messages | less -R(-R让less渲染颜色) - 只看匹配行数:
grep -c "404" access.log,但注意它统计的是“含匹配的行数”,不是“匹配次数” - 真正统计出现次数(如一行有多个
id=):grep -o "id=[0-9]\+" data.txt | wc -l - 排除注释和空行再查:
grep -v "^#" file.conf | grep -v "^$" | grep "listen"
grep -rnI 就够了(-r 递归、-n 行号、-I 跳过二进制),但得记得检查是否真需要递归、是否该加 --include 限定后缀——不然可能扫几千个日志或缓存文件,卡住终端。











