grep 命令实例教程
grep 是 Linux/Unix 最常用的文本搜索工具,作用是在文件/标准输出中匹配指定字符串/正则表达式,并输出匹配行。
全称:Global Regular Expression Print(全局正则表达式打印)。
一、环境与基础语法
1. 基本语法
grep [选项] "匹配内容" 文件名/文件列表
# 或管道用法(接收上游命令输出)
命令 | grep [选项] "匹配内容"
2. 测试文件准备
新建 test.txt 用于所有示例:
cat > test.txt << EOF
hello world
Hello Linux
123 test 456
test grep TEST
apple banana orange
Linux is good
line empty below
# comment line
999 abc 777
EOF
二、最简使用
1. 基础字符串匹配
直接搜索普通字符串,区分大小写:
# 搜索包含 test 的行
grep "test" test.txt
输出:
123 test 456
test grep TEST
2. 多文件同时搜索
同时匹配多个文件:
grep "Linux" test.txt a.txt b.txt
3. 管道结合(最常用场景)
从命令输出里过滤内容,日常使用最多:
# 查看进程,过滤 ssh
ps aux | grep ssh
# 查看端口,过滤 80
netstat -ntlp | grep 80
# 查看日志,过滤 error
cat /var/log/messages | grep error
三、核心常用参数
参数分:大小写、显示控制、反向匹配、递归搜索、正则、统计、行号、颜色 六大类。
小技巧:
grep参数可合并,如grep -ni "test" test.txt
(一)大小写相关
1. -i 忽略大小写(ignore-case)
匹配时不区分大小写,高频参数。
grep -i "test" test.txt
会同时匹配 test / TEST / Test。
2. 默认:区分大小写
不加 -i 严格匹配大小写。
(二)反向/排除匹配
1. -v 反向匹配(invert-match)
输出不包含目标字符串的所有行,排除过滤神器。
# 输出所有不包含 Linux 的行
grep -v "Linux" test.txt
实战场景:过滤注释行、空行
# 排除 # 开头注释行
grep -v "^#" nginx.conf
# 排除空行
grep -v "^$" test.txt
(三)显示行号 & 上下文行
1. -n 显示行号(line-number)
输出匹配行的行号,排查日志必备。
grep -n "Linux" test.txt
2. -c 只输出匹配行数(count)
不输出内容,只统计有多少行匹配。
grep -c "test" test.txt
3. -o 只输出匹配到的内容(only-matching)
只打印真正匹配的字符串,而非整行。
grep -o "test" test.txt
4. -A n 显示匹配行 + 后面 n 行(After)
查看匹配内容下文,日志排查超级常用。
# 匹配 Linux,同时显示后面 2 行
grep -A 2 "Linux" test.txt
5. -B n 显示匹配行 + 前面 n 行(Before)
查看匹配内容上文。
grep -B 1 "Linux" test.txt
6. -C n 显示前后各 n 行(Context)
等价于 -A n -B n,上下文一起看。
# 前后各 1 行
grep -C 1 "Linux" test.txt
(四)递归搜索(遍历目录)
-r / -R 递归搜索目录(recursive)
在整个目录及子目录下所有文件中搜索。
grep -r:跟随软链接grep -R:不跟随软链接(推荐)
语法:
# 在 /etc 目录下递归搜索包含 root 的文件
grep -r "root" /etc/
# 组合 -n 显示行号,-i 忽略大小写
grep -rni "linux" /home/
实战:全局查找配置关键字
grep -rn "listen" /etc/nginx/
(五)匹配整行/整单词(精准匹配)
1. -w 匹配完整单词(word-regexp)
只匹配独立单词,不匹配字符串中的子串。
示例对比:
# 原文件有 test、TEST、greetest
# 普通匹配:会命中包含 test 的所有子串
grep "test" test.txt
# 整单词匹配:只匹配独立单词 test
grep -w "test" test.txt
2. -x 匹配整行(line-regexp)
整行内容必须完全一致才匹配。
# 只匹配整行等于 hello world 的行
grep -x "hello world" test.txt
(六)颜色高亮 & 静默模式
1. --color=auto 高亮匹配内容
绝大多数系统默认别名 grep=grep--color=auto,手动使用:
grep --color=auto "test" test.txt
2. -q 静默模式(quiet)
不输出任何内容,只返回执行状态码,多用于 Shell 脚本判断。
- 匹配到:返回
0(正常) - 未匹配到:返回
1
脚本用法示例:
if grep -q "error" app.log; then
echo "日志发现错误"
fi
3. -l 只输出匹配的文件名(files-with-matches)
只打印哪些文件包含目标内容,不打印行内容。
# 递归查找,只输出含 Linux 的文件名
grep -rl "Linux" ./
4. -L 只输出不匹配的文件名(files-without-match)
和 -l 相反,列出不含目标内容的文件。
四、进阶:grep 正则表达式(核心难点)
grep 默认支持 基础正则(BRE),扩展正则需要加参数。
1. 正则模式开关
- 普通
grep:基础正则 BRE(? + | () {}需要转义\) -E/egrep:扩展正则 ERE(不用转义,写法简洁,推荐)egrep等价于grep -E
2. 常用正则元字符 + 实例
(1)^ 行首匹配
匹配以指定字符开头的行:
# 匹配以 # 开头的注释行
grep "^#" test.txt
# 匹配以数字开头的行
grep "^[0-9]" test.txt
(2)$ 行尾匹配
匹配以指定字符结尾的行:
# 匹配以 world 结尾的行
grep "world$" test.txt
# 匹配空行(行首=行尾)
grep "^$" test.txt
(3). 匹配任意单个字符
. 代表任意一个字符(不包含换行):
# 匹配 t 后面跟 1 个字符,再跟 st
grep "t.st" test.txt
(4)[] 字符集合
[abc]:匹配 a/b/c 任意一个[0-9]:数字[a-z]:小写字母[A-Z]:大写字母[^0-9]:非数字(^ 在中括号内表示取反)
# 匹配包含数字的行
grep "[0-9]" test.txt
# 匹配小写字母
grep "[a-z]" test.txt
(5)* 匹配前一个字符 0 次或多次
# 匹配 te + 任意个 s
grep "tes*" test.txt
(6)? + | () {} 扩展正则(必须加 -E)
基础 grep 需要
\?\+\|转义,-E无需转义
?:前一个字符 0 次或 1 次+:前一个字符 1 次或多次|:或 逻辑():分组{n}:精确匹配 n 次;{n,}至少 n 次;{n,m}n~m 次
示例:
# -E 启用扩展正则
# 匹配 test 或 Linux
grep -E "test|Linux" test.txt
# 匹配 t 后面连续 2 个 e
grep -E "te{2}" test.txt
# 分组:匹配 hello 或 Hello
grep -E "(H|h)ello" test.txt
3. -F 禁用正则(纯字符串匹配)
-F = fgrep,把匹配内容当作普通字符串,元字符(. * ^ $)失去正则意义。
如果搜索内容包含 . * 等符号,必加 -F,避免正则解析错误。
# 搜索包含 "a.b" 字符串(不是正则)
grep -F "a.b" test.txt
五、高频组合参数(生产常用组合)
整理工作中最实用的组合命令,直接复制即用:
-
忽略大小写 + 显示行号
grep -ni "关键字" file -
排除空行 + 排除注释行(配置文件清洗)
grep -v "^#" file.conf | grep -v "^$" -
递归搜索目录 + 行号 + 忽略大小写
grep -rni "关键字" /目标目录/ -
查看日志 + 匹配行 + 前后 5 行(查报错上下文)
grep -C 5 "error" app.log -
只统计匹配行数
grep -c "关键字" file -
脚本判断:是否包含关键字(静默模式)
grep -q "关键字" file && echo "存在" || echo "不存在" -
精准匹配完整单词
grep -w "word" file
六、grep 家族三兄弟区别
Linux 里三个同源命令,本质都是 grep,只是正则模式不同:
- grep:默认基础正则(BRE),特殊字符需
\转义 - egrep =
grep -E:扩展正则(ERE),不用转义,推荐日常正则使用 - fgrep =
grep -F:纯字符串匹配,不解析正则,含特殊符号优先用
七、常见坑点总结
- 搜索内容含
. * [ ]等符号:一定要加-F,否则被当作正则; - 正则
| () + ?不生效:忘记加-E; - 大小写匹配异常:忘记加
-i; - 递归搜索找不到文件:检查目录权限,或确认
-r/-R; - 想排除多行内容:多次管道
grep -v叠加。
八、速查参数表
| 参数 | 作用 |
|---|---|
| -i | 忽略大小写 |
| -v | 反向匹配(排除) |
| -n | 显示行号 |
| -c | 统计匹配行数 |
| -o | 只输出匹配内容 |
| -A n | 显示匹配行及后 n 行 |
| -B n | 显示匹配行及前 n 行 |
| -C n | 显示前后各 n 行 |
| -r/-R | 递归搜索目录 |
| -w | 匹配完整单词 |
| -x | 匹配整行 |
| -l | 只输出匹配的文件名 |
| -L | 只输出不匹配的文件名 |
| -q | 静默模式(脚本用) |
| -E | 启用扩展正则 |
| -F | 纯字符串匹配(禁用正则) |


1860

被折叠的 条评论
为什么被折叠?



