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 TEST2. 多文件同时搜索
同时匹配多个文件:
grep"Linux"test.txt a.txt b.txt3. 管道结合(最常用场景)
从命令输出里过滤内容,日常使用最多:
# 查看进程,过滤 sshpsaux|grepssh# 查看端口,过滤 80netstat-ntlp|grep80# 查看日志,过滤 errorcat/var/log/messages|greperror三、核心常用参数
参数分:大小写、显示控制、反向匹配、递归搜索、正则、统计、行号、颜色六大类。
小技巧:
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.txt2.-c只输出匹配行数(count)
不输出内容,只统计有多少行匹配。
grep-c"test"test.txt3.-o只输出匹配到的内容(only-matching)
只打印真正匹配的字符串,而非整行。
grep-o"test"test.txt4.-A n显示匹配行 + 后面 n 行(After)
查看匹配内容下文,日志排查超级常用。
# 匹配 Linux,同时显示后面 2 行grep-A2"Linux"test.txt5.-B n显示匹配行 + 前面 n 行(Before)
查看匹配内容上文。
grep-B1"Linux"test.txt6.-C n显示前后各 n 行(Context)
等价于-A n -B n,上下文一起看。
# 前后各 1 行grep-C1"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# 整单词匹配:只匹配独立单词 testgrep-w"test"test.txt2.-x匹配整行(line-regexp)
整行内容必须完全一致才匹配。
# 只匹配整行等于 hello world 的行grep-x"hello world"test.txt(六)颜色高亮 & 静默模式
1.--color=auto高亮匹配内容
绝大多数系统默认别名grep=grep--color=auto,手动使用:
grep--color=auto"test"test.txt2.-q静默模式(quiet)
不输出任何内容,只返回执行状态码,多用于 Shell 脚本判断。
- 匹配到:返回
0(正常) - 未匹配到:返回
1
脚本用法示例:
ifgrep-q"error"app.log;thenecho"日志发现错误"fi3.-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 个字符,再跟 stgrep"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 + 任意个 sgrep"tes*"test.txt(6)? + | () {}扩展正则(必须加-E)
基础 grep 需要
\?\+\|转义,-E无需转义
?:前一个字符0 次或 1 次+:前一个字符1 次或多次|:或逻辑():分组{n}:精确匹配 n 次;{n,}至少 n 次;{n,m}n~m 次
示例:
# -E 启用扩展正则# 匹配 test 或 Linuxgrep-E"test|Linux"test.txt# 匹配 t 后面连续 2 个 egrep-E"te{2}"test.txt# 分组:匹配 hello 或 Hellogrep-E"(H|h)ello"test.txt3.-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-C5"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 | 纯字符串匹配(禁用正则) |