Linux系统中正则表达式详解(含grep命令+实操案例)
前言
在Linux系统中,grep是最常用、最强大的文本搜索工具之一,核心功能是使用正则表达式(或普通字符串)搜索目标文本,并将匹配的行打印输出。无论是日常排查日志、筛选配置文件,还是批量处理文本,grep都是必备工具。本文将从基础用法、核心选项、正则表达式、grep命令族、通配符等方面,结合实操案例详细讲解grep的使用方法,新手也能快速上手。
一、grep命令基础语法
grep命令的基本格式非常简洁,核心由「选项+匹配模式+目标文件」三部分组成,语法如下:
grep [选项] [匹配模式] [文件...]
关键说明:
选项(可选):用于调整搜索行为,比如忽略大小写、显示行号等,下文会详细列举。
匹配模式(必填):可以是普通字符串、变量,也可以是正则表达式。注意:如果模式中包含空格,必须用双引号("")将模式括起来,否则会被Shell解析为多个参数。
文件(必填):可以指定单个文件、多个文件,也可以使用通配符(如*.txt)匹配一批文件。
演示示例:
grep "root" test.txt
test.txt内容如下:
hello world helo linux hellllllo cloud Cloud Service 123abc测试文本 xcb738 demo 4J973U data iivey program Iivey Code the book is good them are apples yes YES Yes B-Pk-y test admin@163.com JOOB test JOOOB linux JOOOOOB centos aaaa123ABC root:x:0:0:root:/root:/bin/bash nginx server start # 这是一行注释内容 micky web service user certificate user login success ERROR: connection refused

二、grep核心选项详解(附案例)
grep的选项众多,以下是日常工作中最常用的核心选项,结合表格和实操案例说明,方便大家直接套用:
选项 | 核心意义 | 实操案例 |
|---|---|---|
-c | 只输出匹配行的数量,不显示具体匹配内容 | grep -c "root" /etc/passwd(统计/etc/passwd中包含root的行数) |
-i | 搜索时忽略大小写,不区分大写和小写字母 | grep -i "linux" test.txt(匹配Linux、LINUX、linux等所有大小写组合) |
-h | 查询多个文件时,不显示匹配内容所属的文件名 | grep -h "error" *.log(搜索所有.log文件中的error,不显示文件名) |
-l | 只列出包含匹配内容的文件名,不显示具体匹配行 | grep -l "test" /home/*(列出/home目录下包含test的所有文件) |
-n | 显示所有匹配行,并标注该行在文件中的行号(非常实用) | grep -n "nginx" /etc/nginx/nginx.conf(显示匹配nginx的行及行号) |
-s | 不显示“文件不存在”或“无匹配内容”的错误信息,避免输出冗余 | grep -s "test" a.txt b.txt(即使a.txt不存在,也不会报错) |
-v | 反向匹配:显示不包含匹配模式的所有行(常用排查排除) | grep -v "^#" /etc/profile(过滤掉/etc/profile中以#开头的注释行) |
-w | 匹配整词,避免部分匹配(比如匹配test,不会匹配test123、atest) | grep -w "test" test.txt(只匹配独立的test单词) |
-r | 递归搜索:不仅搜索当前工作目录,还会递归搜索所有子目录下的文件 | grep -r "error" /var/log/(递归搜索/var/log目录下所有包含error的文件) |
-E | 支持扩展正则表达式(等价于egrep),无需对元字符转义 | grep -E "a|b" test.txt(匹配包含a或b的行) |
-F | 不支持正则表达式,按照字符串字面意思匹配(等价于fgrep),速度更快 | grep -F "a*b" test.txt(匹配字面量a*b,不把*当作元字符) |
补充案例(模式含空格的情况):
# 错误用法:模式含空格,未加引号,Shell会把 user 当作匹配词,certificate、test.txt 当作文件 grep user certificate test.txt # 正确用法:匹配字符串包含空格,必须用双引号包裹 grep "user certificate" test.txt
![]()
三、grep命令族详解
Linux系统中,grep并非单一命令,而是一个“命令族”,包含三种常用形式,核心区别在于对正则表达式的支持程度,具体如下:
grep(标准grep):默认支持基本正则表达式(BRE),部分元字符(如+、?、|等)需要用反斜杠(\)转义才能生效。
grep "a\{2\}" test.txt # 匹配 aa![]()
egrep(扩展grep):支持基本正则表达式和扩展正则表达式(ERE),无需对扩展元字符转义,等价于
grep -E。
egrep "a+" test.txt # 匹配 a、aa、aaa

fgrep(快速grep):不支持任何正则表达式,仅按照字符串字面意思匹配,速度最快,等价于
grep -F。
fgrep "a*b" test.txt # 只匹配文本 a*b
![]()
总结:日常使用中,若需使用扩展正则,优先用 grep -E(比egrep更通用);若只需匹配固定字符串,用 grep -F(速度更快)。
四、grep与正则表达式(核心重点)
grep的强大之处在于支持正则表达式,正则表达式(简称RE)是由普通字符和元字符组成的字符串,用于精准匹配文本模式。下面分「基础正则」「扩展正则」「POSIX字符类」三部分讲解,结合案例更易理解。
4.1 正则表达式基础
正则表达式由「普通字符」和「元字符」组成:
普通字符:无特殊含义,按字面意思匹配,如a、b、1、2、linux等。
元字符:被Shell赋予特殊含义,用于灵活匹配文本,如*、^、$、[]等(下文详细说明)。
grep "hello" test.txt
![]()
一个完整的正则表达式,通常包含以下一种或多种元素:
字符集:仅包含普通字符,是最简单的正则形式(如“linux”)。
锚:指定匹配内容在文本行中的位置(如行首、行尾)。
修饰符:扩大或缩小匹配范围(如重复次数、转义)。
grep "^abc" test.txt
![]()
4.2 基础正则元字符(grep默认支持)
以下是grep默认支持的基础正则元字符,每一个都配实操案例,方便直接测试:
元字符 | 核心意义 | 案例说明 |
|---|---|---|
* | 匹配前面的普通字符0次或多次 | hel*o:匹配heo(l出现0次)、helo(l出现1次)、hello(l出现2次)等 |
. | 匹配任意一个字符(除了换行符) | ...73.:匹配前3个任意字符、中间为73、最后1个任意字符(如xcb738、4J973U) |
^ | 匹配行首,即行的第一个字符是^后面的字符 | ^cloud:匹配所有以cloud开头的行;^$:匹配空白行(无任何字符) |
$ | 匹配行尾,即行的最后一个字符是$前面的字符 | micky$:匹配所有以micky结尾的行 |
[] | 匹配中括号内的任意一个字符;^在括号内表示取反 | 1. [xyz]:匹配x、y、z中的任意一个;2. [c-n]:匹配c到n之间的任意字符;3. [^b-d]:匹配b到d之外的任意字符 |
\ | 转义符:屏蔽元字符的特殊含义,使其按字面意思匹配 | \$:匹配字面量$(不表示行尾);\\:匹配字面量\ |
\<\> | 精确匹配单词边界(需转义),仅匹配独立的单词 | \<the\>:匹配独立的the,不匹配them、there、other等 |
\{}系列 | 匹配前面字符的指定重复次数(需转义) | 1. \{n\}:匹配n次(如JO\{3\}B:匹配JOOOB);2. \{n,\}:至少匹配n次;3. \{n,m\}:匹配n到m次 |
实操案例:
# 匹配包含5个小写字母的行
grep "[a-z]\{5\}" test.txt 
# 匹配不包含小写字母的行 grep "[^a-z]" test.txt

# 精确匹配单词iivey grep "\<iivey\>" test.txt
![]()
4.3 扩展正则元字符(需加-E选项)
扩展正则元字符在基础正则的基础上增加了更灵活的匹配规则,需使用 grep -E(或egrep)才能支持,无需对元字符转义,具体如下:
元字符 | 核心意义 | 案例说明 |
|---|---|---|
? | 匹配前面的普通字符0次或1次(区别于*,不能匹配多次) | grep -E "iivey?" exp1.txt(匹配iivey或iive) |
+ | 匹配前面的普通字符1次或多次(区别于*,不能匹配0次) | grep -E "hel+o" test.txt(匹配helo、hello等,不匹配heo) |
() | 括起一组正则表达式,作为一个整体匹配 | grep -E "(ab)+" test.txt(匹配ab、abab、ababab等) |
| | “或”操作符,匹配多个选项中的任意一个 | grep -E "a|b|c" test.txt(匹配包含a、b或c的行) |
grep -E "cat|dog" test.txt
![]()
4.4 POSIX字符类(适配多字符编码)
为了保持不同国家字符编码的一致性,POSIX(可移植操作系统接口)定义了特殊的字符类,格式为 [:classname:],grep完全支持,使用时需用引号或双中括号([[ ]])引起来。
POSIX字符类 | 等价写法 | 核心意义 |
|---|---|---|
[:upper:] | [A-Z] | 匹配所有大写英文字母 |
[:lower:] | [a-z] | 匹配所有小写英文字母 |
[:digit:] | [0-9] | 匹配所有阿拉伯数字 |
[:alnum:] | [0-9a-zA-Z] | 匹配所有大小写字母和阿拉伯数字 |
[:space:] | 无 | 匹配空格或Tab键 |
[:alpha:] | [a-zA-Z] | 匹配所有大小写英文字母 |
[:xdigit:] | [0-9A-Fa-f] | 匹配所有16进制数字 |
实操案例:
# 匹配包含数字的行 grep '[[:digit:]]' test.txt

# 匹配包含大写字母的行 grep '[[:upper:]]' test.txt

五、通配符(globbing)与正则元字符的区别
很多新手会混淆「通配符」和「正则元字符」,两者的核心区别的是:通配符用于匹配文件名,正则元字符用于匹配文本内容。
通配符(globbing)是将包含通配符的非具体文件名,扩展为一批具体文件名的过程,常用通配符及含义如下(与正则元字符含义不同):
*:匹配任意位数的任意字符(区别于正则中的“重复匹配”)。?:匹配任意一位字符(区别于正则中的“0次或1次匹配”)。^:在通配符中表示“取反”(区别于正则中的“行首匹配”)。[]:匹配中括号内的任意一个字符(与正则中[]含义一致)。{}:匹配括号内的任意一个字符串(批量匹配)。
实操案例(通配符常用场景):
# 列出当前目录下所有.sh后缀的文件(*匹配任意字符)
ls -l *.sh
# 列出当前目录下以mytest开头、后面跟1个任意字符、.sh结尾的文件
ls -l mytest?.sh
# 列出当前目录下以e或m开头、任意后缀(非.sh)的文件
ls [em]*.[^sh]*
# 列出当前目录下以m或b开头、.sh结尾的文件({}批量匹配)
ls {m,b}*.sh
# 批量创建1.doc到10.doc的文件
mkdir {1..10}.doc六、常见实操场景汇总(必看)
结合前面的知识点,整理几个日常工作中最常用的grep实操场景,直接复制即可使用:
1.过滤配置文件注释行(排除#开头和空白行):
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
2.递归搜索日志中的错误信息,并显示行号:
grep -rn "error" /var/log/nginx/
3.统计日志中包含“success”的行数(忽略大小写):
grep -ci "success" /var/log/access.log
4.匹配包含数字或大写字母的行:
grep -E '[[:digit:]]|[[:upper:]]' test.txt
5.列出当前目录及子目录下,包含“test”的所有文件:
grep -rl "test" ./
七、常见易错点总结
模式含空格时,必须用双引号括起来,否则Shell会解析错误。
基础正则中,+、?、|、()等元字符需转义(\),扩展正则(grep -E)无需转义。
通配符和正则元字符含义不同:通配符匹配文件名,正则匹配文本内容。
-r选项是递归搜索目录,不是递归匹配文本内容;-w选项是匹配整词,不是匹配单词的一部分。
POSIX字符类需用引号或双中括号引起来,否则无法生效。
总结:grep命令的核心是“匹配模式”,掌握正则表达式和常用选项,就能灵活应对各种文本搜索场景。建议大家结合本文案例,实际操作测试,加深记忆。如果有其他用法或疑问,欢迎在评论区补充交流~
到此这篇关于Linux系统中正则表达式详解(含grep命令+实操案例)的文章就介绍到这了,更多相关Linux正则表达式grep命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


最新评论