整体说明
- 常用记忆:
- 找内容用
-r,忽略大小写-i, - 只要文件名
-l,统计个数-c, - 看上下文
-C,画重点--color, - 过滤垃圾用
-v,静默判断用-q
- 找内容用
grep 命令家族
- grep 命令还包含些变体:
命令 本质 适用场景 grep基础命令 普通字符串搜索 egrep等同于 grep -E使用扩展正则(不用加反斜杠转义 {}+?|)fgrep等同于 grep -F搜索纯固定字符串(不解析正则),搜索特殊字符(如 $*)时极快rgrep等同于 grep -r递归搜索子目录
核心参数/选项及其解释
- 匹配控制类
参数 作用 -i忽略大小写(最常用) -v反向匹配(显示不包含该字符串的行) -w匹配整个单词(不会匹配到部分词,如搜 log不会命中logistics)-x匹配整行(行内容必须完全等于模式) -E使用扩展正则( egrep)-F将模式视为固定字符串( fgrep)-P使用 Perl 正则(支持 \d\s等,Linux GNU grep 专属 ,macOS 需brew install grep) - 输入输出控制类
参数 作用 -l只输出匹配的文件名(不显示具体行) -L输出不匹配的文件名(反向文件列表) -n显示匹配行的行号 -c只输出匹配的行数(统计个数) -o只输出匹配到的部分(不输出整行,提取手机号/邮箱必备) -q静默模式(无任何输出,仅通过 $?返回值判断是否找到,用于 if 判断)-s不显示“文件不存在”或“无法读取”的错误信息 - 上下文控制类(排查日志神技)
参数 作用 -A n显示匹配行及后面 (After) n 行 -B n显示匹配行及前面 (Before) n 行 -C n显示匹配行及前后 (Context) 各 n 行 - 文件与目录遍历类
参数 作用 -r/-R递归搜索子目录( -R会跟随符号链接)--include=*.ext只搜索指定后缀的文件(如 --include=*.go)--exclude=*.log排除指定后缀的文件 --exclude-dir=dir排除指定目录(如 --exclude-dir=.git)-a将二进制文件当做文本文件处理(强行搜索二进制) -I忽略二进制文件(默认推荐加上,避免终端乱码)
正则表达式
- 基础正则(BRE,默认无需加参数)
元字符 含义 ^匹配行首(如 ^Error)$匹配行尾(如 .$匹配最后字符).匹配任意单个字符(除换行符) *匹配前一个字符 0 次或多次 [abc]匹配括号内任意一个字符 [^abc]匹配不在括号内的任意字符 \转义特殊字符(如搜 IP 需写 \.) - 扩展正则(ERE,需加
-E或使用egrep)元字符 含义 +匹配前一个字符 1 次或多次 ?匹配前一个字符 0 次或 1 次 {n,m}匹配前一个字符 n 到 m 次(如 [0-9]{4})|或(逻辑 OR,如 error|fatal)()分组(如 (abc){2}匹配abcabc) - Perl 正则(
-P,极强但依赖库)元字符 含义 \d匹配数字(等同 [0-9])\s匹配空白符(空格/Tab) \w匹配单词字符(字母、数字、下划线) (?=abc)正向预查(匹配后面是 abc的字符串)
常用命令笔记
代码/文本搜索 场景
1
2
3
4
5
6
7
8
9
10
11# 1. 在当前目录所有 .py 文件中搜索 "main",显示行号
grep -rn --include="*.py" "main" ./
# 2. 搜索但排除 .git 和 node_modules 目录(代码搜索黄金组合)
grep -r --color=auto --exclude-dir={.git,node_modules,dist} "function_name" ./
# 3. 只列出包含 "TODO" 的文件名
grep -rl "TODO" ./src/
# 4. 找出所有不包含 "license" 的文件
grep -L "license" *.txt日志分析 场景
1
2
3
4
5
6
7
8
9
10
11# 1. 搜索错误并显示前后 5 行上下文
grep -C 5 "ERROR" /var/log/app.log
# 2. 搜索凌晨 02:00 到 03:00 之间的日志(配合正则)
grep "^2026-08-31 02:" app.log
# 3. 实时跟踪日志并高亮关键报错(tail + grep)
tail -f /var/log/system.log | grep --color=auto "error\|panic"
# 4. 统计某个接口调用了多少次
grep -c "GET /api/v1/user" access.log提取数据(配合
-o和管道)场景1
2
3
4
5
6
7
8
9
10
11# 1. 提取文本中的所有邮箱地址
grep -oE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
# 2. 提取所有 IPv4 地址
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" file.txt
# 3. 提取所有 19 位手机号(中国)
grep -oP "1[3-9]\d{9}" file.txt # 需要 -P 支持
# 4. 只提取 JSON 中 "id" 字段的值(假设格式标准)
grep -oP '"id":\s*"\K[^"]+' data.json
附录:系统运维与进程管理
Linux 系统运维常用命令:
1
2
3
4
5
6
7
8# 1. 查找包含 nginx 的进程(排除 grep 自身进程)——经典技巧
ps aux | grep [n]ginx # 中括号让 grep 匹配 "nginx" 但不匹配自己的命令行
# 2. 查看历史命令中 git 提交记录(不包含 help)
history | grep "git commit" | grep -v "help"
# 3. 查看 CPU 信息(只提取型号)
cat /proc/cpuinfo | grep "model name" | uniq脚本中的条件判断
1
2
3
4
5# 检查日志是否包含 "FATAL",包含则发报警
if grep -q "FATAL" /var/log/app.log; then
echo "发现致命错误!" >&2
exit 1
fi
附录:高级技巧
grep + find(处理超大目录或复杂文件名过滤)
grep -r无法精细控制文件修改时间,用find配合:1
2
3
4
5# 搜索最近 7 天内修改过的、大于 1MB 的文件中的 "password"
find /var/log -type f -mtime -7 -size +1M -exec grep -l "password" {} \;
# 安全处理带空格的文件(使用 xargs -0)
find . -name "*.yml" -print0 | xargs -0 grep -n "port"grep+sed/awk(批量替换)1
2
3
4
5# 找出所有包含 "old_ip" 的文件,并批量替换为 "new_ip"
grep -rl "192.168.1.1" ./config/ | xargs sed -i 's/192.168.1.1/10.0.0.1/g'
# 找出所有包含 "TODO" 的文件并统计每个文件的数量
grep -c "TODO" $(grep -rl "TODO" ./src/)多行匹配(跨行搜索)
- 默认 grep 按行读,若想匹配跨行的
begin到end:1
2
3
4
5# 方法1:使用 -z 将文件视为单行(适合小文件)
grep -Pzo "begin.*?end" file.txt
# 方法2:使用 pcregrep(更专业)
pcregrep -M "begin(\n|.)*?end" file.txt
- 默认 grep 按行读,若想匹配跨行的
附录:注意事项
- 优先加
-F:如果搜的是普通字符串(如http://),加-F可跳过正则解析,速度提升数倍 - 大文件用
-m 1:grep -m 1 "error" huge.log找到第一个就停止,避免读完整文件 - 慎用
-r扫根目录- 永远别
grep -r /除非加了--exclude-dir={proc,sys,dev},否则会卡死
- 永远别
- 管道中多用
LC_ALL=C- 放在命令开头
LC_ALL=C grep "abc",跳过 Unicode 编码检测,加速明显
- 放在命令开头
-I保护终端- 如果不小心搜了二进制文件(
.so.bin),终端会输出乱码,加上-I自动忽略
- 如果不小心搜了二进制文件(