
grep 命令实例教程grep是 Linux/Unix 最常用的文本搜索工具作用是在文件/标准输出中匹配指定字符串/正则表达式并输出匹配行。全称Global Regular Expression Print全局正则表达式打印。一、环境与基础语法1. 基本语法grep[选项]匹配内容文件名/文件列表# 或管道用法接收上游命令输出命令|grep[选项]匹配内容2. 测试文件准备新建test.txt用于所有示例cattest.txtEOF 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 的行greptesttest.txt输出123 test 456 test grep TEST2. 多文件同时搜索同时匹配多个文件grepLinuxtest.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-itesttest.txt会同时匹配test/TEST/Test。2. 默认区分大小写不加-i严格匹配大小写。二反向/排除匹配1.-v反向匹配invert-match输出不包含目标字符串的所有行排除过滤神器。# 输出所有不包含 Linux 的行grep-vLinuxtest.txt实战场景过滤注释行、空行# 排除 # 开头注释行grep-v^#nginx.conf# 排除空行grep-v^$test.txt三显示行号 上下文行1.-n显示行号line-number输出匹配行的行号排查日志必备。grep-nLinuxtest.txt2.-c只输出匹配行数count不输出内容只统计有多少行匹配。grep-ctesttest.txt3.-o只输出匹配到的内容only-matching只打印真正匹配的字符串而非整行。grep-otesttest.txt4.-A n显示匹配行 后面 n 行After查看匹配内容下文日志排查超级常用。# 匹配 Linux同时显示后面 2 行grep-A2Linuxtest.txt5.-B n显示匹配行 前面 n 行Before查看匹配内容上文。grep-B1Linuxtest.txt6.-C n显示前后各 n 行Context等价于-A n -B n上下文一起看。# 前后各 1 行grep-C1Linuxtest.txt四递归搜索遍历目录-r / -R递归搜索目录recursive在整个目录及子目录下所有文件中搜索。grep -r跟随软链接grep -R不跟随软链接推荐语法# 在 /etc 目录下递归搜索包含 root 的文件grep-rroot/etc/# 组合 -n 显示行号-i 忽略大小写grep-rnilinux/home/实战全局查找配置关键字grep-rnlisten/etc/nginx/五匹配整行/整单词精准匹配1.-w匹配完整单词word-regexp只匹配独立单词不匹配字符串中的子串。示例对比# 原文件有 test、TEST、greetest# 普通匹配会命中包含 test 的所有子串greptesttest.txt# 整单词匹配只匹配独立单词 testgrep-wtesttest.txt2.-x匹配整行line-regexp整行内容必须完全一致才匹配。# 只匹配整行等于 hello world 的行grep-xhello worldtest.txt六颜色高亮 静默模式1.--colorauto高亮匹配内容绝大多数系统默认别名grepgrep--colorauto手动使用grep--colorautotesttest.txt2.-q静默模式quiet不输出任何内容只返回执行状态码多用于 Shell 脚本判断。匹配到返回0正常未匹配到返回1脚本用法示例ifgrep-qerrorapp.log;thenecho日志发现错误fi3.-l只输出匹配的文件名files-with-matches只打印哪些文件包含目标内容不打印行内容。# 递归查找只输出含 Linux 的文件名grep-rlLinux./4.-L只输出不匹配的文件名files-without-match和-l相反列出不含目标内容的文件。四、进阶grep 正则表达式核心难点grep默认支持基础正则BRE扩展正则需要加参数。1. 正则模式开关普通grep基础正则 BRE? | () {}需要转义\-E/egrep扩展正则 ERE不用转义写法简洁推荐egrep等价于grep -E2. 常用正则元字符 实例1^行首匹配匹配以指定字符开头的行# 匹配以 # 开头的注释行grep^#test.txt# 匹配以数字开头的行grep^[0-9]test.txt2$行尾匹配匹配以指定字符结尾的行# 匹配以 world 结尾的行grepworld$test.txt# 匹配空行行首行尾grep^$test.txt3.匹配任意单个字符.代表任意一个字符不包含换行# 匹配 t 后面跟 1 个字符再跟 stgrept.sttest.txt4[]字符集合[abc]匹配 a/b/c 任意一个[0-9]数字[a-z]小写字母[A-Z]大写字母[^0-9]非数字^ 在中括号内表示取反# 匹配包含数字的行grep[0-9]test.txt# 匹配小写字母grep[a-z]test.txt5*匹配前一个字符 0 次或多次# 匹配 te 任意个 sgreptes*test.txt6? | () {}扩展正则必须加-E基础 grep 需要\?\\|转义-E无需转义?前一个字符0 次或 1 次前一个字符1 次或多次|或逻辑()分组{n}精确匹配 n 次{n,}至少 n 次{n,m}n~m 次示例# -E 启用扩展正则# 匹配 test 或 Linuxgrep-Etest|Linuxtest.txt# 匹配 t 后面连续 2 个 egrep-Ete{2}test.txt# 分组匹配 hello 或 Hellogrep-E(H|h)ellotest.txt3.-F禁用正则纯字符串匹配-Ffgrep把匹配内容当作普通字符串元字符. * ^ $失去正则意义。如果搜索内容包含. *等符号必加-F避免正则解析错误。# 搜索包含 a.b 字符串不是正则grep-Fa.btest.txt五、高频组合参数生产常用组合整理工作中最实用的组合命令直接复制即用忽略大小写 显示行号grep-ni关键字file排除空行 排除注释行配置文件清洗grep-v^#file.conf|grep-v^$递归搜索目录 行号 忽略大小写grep-rni关键字/目标目录/查看日志 匹配行 前后 5 行查报错上下文grep-C5errorapp.log只统计匹配行数grep-c关键字file脚本判断是否包含关键字静默模式grep-q关键字fileecho存在||echo不存在精准匹配完整单词grep-wwordfile六、grep 家族三兄弟区别Linux 里三个同源命令本质都是 grep只是正则模式不同grep默认基础正则BRE特殊字符需\转义egrepgrep -E扩展正则ERE不用转义推荐日常正则使用fgrepgrep -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纯字符串匹配禁用正则