正则表达式完全指南:从入门到实战应用

目录

[1. 正则表达式基础概念](#1. 正则表达式基础概念)

什么是正则表达式

最简单的正则表达式:完全匹配

[2. 行首和行尾匹配](#2. 行首和行尾匹配)

行定位符元字符

行首匹配示例

行尾匹配示例

精确匹配整个行

[3. 通配符和重复匹配](#3. 通配符和重复匹配)

通配符(.)

字符集匹配([])

[重复匹配 - 星号(*)](#重复匹配 - 星号(*))

精确重复匹配

[4. 基本正则表达式 vs 扩展正则表达式](#4. 基本正则表达式 vs 扩展正则表达式)

主要区别

常用元字符对照表

重复匹配元字符

字符类元字符

单词边界元字符

[5. grep命令常用选项](#5. grep命令常用选项)

常用选项表

忽略大小写示例

反向匹配示例

排除注释行

多模式搜索

[6. 在编辑器中搜索](#6. 在编辑器中搜索)

vim编辑器搜索

less查看器搜索

总结


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

匹配:catcutc$t

  • c.t 匹配c + 任意字符 + t

字符集匹配([])

使用方括号匹配特定字符

示例:

bash 复制代码
grep 'c[aou]t' filename

匹配:catcotcut

  • [aou] 匹配a、o或u中的任意一个

重复匹配 - 星号(*)

* 匹配前一个字符的零次或多次重复

示例1:

bash 复制代码
grep 'c[aou]*t' filename

匹配:coatcoot

  • [aou]* 匹配a、o、u的零次或多次出现

示例2:

bash 复制代码
grep 'c.*t' filename

匹配:catcoatculvertct

  • .* 匹配任意字符的零次或多次出现

精确重复匹配

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 查找上一个


总结

正则表达式是文本处理的强大工具,通过掌握:

  1. 基础匹配:完全匹配、行首行尾定位

  2. 通配符:单个字符、字符集匹配

  3. 重复匹配:零次或多次、精确次数等

  4. grep选项:忽略大小写、反向匹配、多模式搜索

  5. 编辑器集成:vim、less中的搜索功能

相关推荐
东亚_劲夫4 小时前
Linux线程
linux·运维
搬砖的小码农_Sky4 小时前
Ubuntu Server 命令行关机指南
linux·运维·ubuntu
zzzsde5 小时前
【Linux】基础指令(2):理解Linux的指令和核心概念
linux·运维·服务器
Empty_7776 小时前
Keepalived双机热备
linux·git·github
wdfk_prog12 小时前
[Linux]学习笔记系列 -- [kernel][time]alarmtimer
linux·笔记·学习
小志biubiu12 小时前
【Linux】Ext系列文件系统
linux·服务器·c语言·经验分享·笔记·ubuntu·操作系统
ha204289419412 小时前
Linux操作系统学习之---基于环形队列的生产者消费者模型(毛坯版)
linux·c++·学习
南林yan14 小时前
Debian、Ubuntu、CentOS:Linux 三大发行版的核心区别
linux·ubuntu·debian·linux内核
Wang's Blog16 小时前
Linux小课堂: NGINX反向代理服务器配置与实践
linux·运维·nginx