目录
[1. 正则表达式基础概念](#1. 正则表达式基础概念)
[2. 行首和行尾匹配](#2. 行首和行尾匹配)
[3. 通配符和重复匹配](#3. 通配符和重复匹配)
[重复匹配 - 星号(*)](#重复匹配 - 星号(*))
[4. 基本正则表达式 vs 扩展正则表达式](#4. 基本正则表达式 vs 扩展正则表达式)
[5. grep命令常用选项](#5. grep命令常用选项)
[6. 在编辑器中搜索](#6. 在编辑器中搜索)
1. 正则表达式基础概念
什么是正则表达式
正则表达式是一种强大的模式匹配工具,用于在文本中查找、替换符合特定模式的字符串。它被广泛应用于:
-
文本编辑器(vim、less)
-
命令行工具(grep、sed、awk)
-
编程语言(Perl、Python、C)
最简单的正则表达式:完全匹配
最基本的正则表达式就是完全匹配搜索的字符串。
示例数据文件内容:
bash
cat
dog
concatenate
dogma
category
educated
boondoggle
vindication
childog
搜索命令:
bash
grep 'cat' filename
注:匹配指定文件里的内容
匹配结果:
bash
cat
concatenate
category
educated
vindication
解析:
-
搜索包含连续字符"cat"的所有行
-
不要求"cat"是独立的单词
-
只要字符串中包含"cat"就会被匹配
2. 行首和行尾匹配
行定位符元字符
-
^:匹配行首 -
$:匹配行尾
行首匹配示例
bash
grep '^cat' filename
匹配结果:
bash
cat
category
解析:
-
^cat只匹配以"cat"开头的行 -
排除了"concatenate"、"educated"等包含"cat"但不是行首的单词
行尾匹配示例
bash
grep 'cat$' filename
匹配结果:
bash
cat
解析:
-
cat$只匹配以"cat"结尾的行 -
只有独立的"cat"行符合条件
精确匹配整个行
bash
grep '^cat$' filename
匹配结果:
bash
cat
解析:
-
^cat$要求整行就是"cat" -
同时满足行首和行尾的条件
3. 通配符和重复匹配
通配符(.)
点字符 . 匹配任意单个字符
示例:
bash
grep 'c.t' filename
匹配:cat、cut、c$t等
c.t匹配c + 任意字符 + t
字符集匹配([])
使用方括号匹配特定字符
示例:
bash
grep 'c[aou]t' filename
匹配:cat、cot、cut
[aou]匹配a、o或u中的任意一个
重复匹配 - 星号(*)
* 匹配前一个字符的零次或多次重复
示例1:
bash
grep 'c[aou]*t' filename
匹配:coat、coot等
[aou]*匹配a、o、u的零次或多次出现
示例2:
bash
grep 'c.*t' filename
匹配:cat、coat、culvert、ct等
.*匹配任意字符的零次或多次出现
精确重复匹配
bash
grep 'c.\{2\}t' filename
匹配结果:
bash
coat
cart
解析:
-
.\{2\}匹配恰好两个任意字符 -
在基本正则表达式中需要使用转义符
\
4. 基本正则表达式 vs 扩展正则表达式
主要区别
| 特性 | 基本正则表达式 | 扩展正则表达式 |
|---|---|---|
| 特殊字符 | 需要转义 | 默认有特殊含义 |
| 命令 | grep、sed、vim | grep -E、sed -E、less |
常用元字符对照表
重复匹配元字符
| 功能 | 基本语法 | 扩展语法 |
|---|---|---|
| 可选匹配 | \? |
? |
| 零次或多次 | * |
* |
| 一次或多次 | \+ |
+ |
| 精确n次 | \{n\} |
{n} |
| n次或更多 | \{n,\} |
{n,} |
| 最多m次 | \{,m\} |
{,m} |
| n到m次 | \{n,m\} |
{n,m} |
字符类元字符
| 字符类 | 描述 |
|---|---|
[[:alnum:]] |
字母数字字符 |
[[:alpha:]] |
字母字符 |
[[:blank:]] |
空白字符(空格、制表符) |
[[:print:]] |
可打印字符 |
[[:punct:]] |
标点符号字符 |
[[:space:]] |
空格字符 |
[[:upper:]] |
大写字母 |
[[:xdigit:]] |
十六进制数字 |
单词边界元字符
| 元字符 | 描述 |
|---|---|
\b |
匹配词语两侧的空字符串 |
\B |
匹配词语中间的空字符串 |
\< |
匹配词语开头 |
\> |
匹配词语末尾 |
\w |
匹配词语组分(等同[[:alnum:]_]) |
\W |
匹配非词语组分 |
\s |
匹配空格 |
5. grep命令常用选项
常用选项表
| 选项 | 功能描述 |
|---|---|
-i |
忽略大小写 |
-v |
反向匹配(显示不包含模式的行) |
-r |
递归搜索目录 |
-A NUMBER |
显示匹配行后的NUMBER行 |
-B NUMBER |
显示匹配行前的NUMBER行 |
-e |
指定多个模式(逻辑OR) |
-E |
使用扩展正则表达式 |
忽略大小写示例
bash
[user@host ~]$ grep -i serverroot /etc/httpd/conf/httpd.conf
# with "/", the value of ServerRoot is prepended -- so 'log/access_log'
# with ServerRoot set to '/www' will be interpreted by the
# ServerRoot: The top of the directory tree under which the server's
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# same ServerRoot for multiple httpd daemons, you will need to change at
ServerRoot "/etc/httpd"
解析:
-
-i选项使搜索不区分大小写 -
匹配"serverroot"、"ServerRoot"等各种大小写组合
反向匹配示例
bash
[user@host ~]$ grep -v -i server /etc/hosts
127.0.0.1 localhost.localdomain localhost
172.25.254.254 classroom.example.com classroom
172.25.254.254 content.example.com content
172.25.254.254 materials.example.com materials
### rht-vm-hosts file listing the entries to be appended to /etc/hosts
172.25.250.9 workstation.lab.example.com workstation
172.25.250.254 bastion.lab.example.com bastion
172.25.250.220 utility.lab.example.com utility
172.25.250.220 registry.lab.example.com registry
解析:
-
-v显示不包含模式的行 -
-i忽略大小写 -
过滤掉所有包含"server"(不区分大小写)的行
排除注释行
bash
[user@host ~]$ grep -v '^[#;]' /etc/systemd/system/multi-user.target.wants/rsyslog.service
[Unit]
Description=System Logging Service
Documentation=man:rsyslogd(8)
Documentation=https://www.rsyslog.com/doc/
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
ExecReload=/usr/bin/kill -HUP $MAINPID
UMask=0066
StandardOutput=null
Restart=on-failure
LimitNOFILE=16384
[Install]
WantedBy=multi-user.target
解析:
-
^[#;]匹配以#或;开头的行 -
-v排除这些注释行 -
只显示配置文件的有效内容
多模式搜索
bash
[root@host -]# cat /var/log/secure | grep -e 'pam_unix' -e 'user root' -e 'Accepted publickey' | less
Mar 4 03:31:41 localhost passwd[6639]: pam_unix(passwd:chauthtok): password changed for root
Mar 4 03:32:34 localhost sshd[15556]: Accepted publickey for devops from 10.30.0.167 port 56472 ssh2: RSA SHA256:M8ikhcEDm2tQ952007ZvufqEixCFCt+wOWZLNzNIBT0
Mar 4 03:32:34 localhost systemd[15560]: pam_unix(systemd-user:session): session
解析:
-
-e选项指定多个搜索模式 -
使用逻辑OR关系,匹配任意一个模式
-
在系统安全日志中查找认证相关事件
6. 在编辑器中搜索
vim编辑器搜索
bash
[root@host ~]# vim /var/log/boot.log
在vim中:
-
按
/进入搜索模式 -
输入搜索模式
-
按
Enter开始搜索 -
按
n查找下一个匹配项
less查看器搜索
bash
[root@host ~]# less /var/log/messages
在less中:
-
同样使用
/开始搜索 -
按
n查找下一个 -
按
N查找上一个
总结
正则表达式是文本处理的强大工具,通过掌握:
-
基础匹配:完全匹配、行首行尾定位
-
通配符:单个字符、字符集匹配
-
重复匹配:零次或多次、精确次数等
-
grep选项:忽略大小写、反向匹配、多模式搜索
-
编辑器集成:vim、less中的搜索功能