wiki/运维/Linux/笔记/18.正则表达式.md
2026-04-08 19:40:00 +08:00

186 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 1、正则表达式概览
正则表达式Regular Expression用于描述一类字符串匹配规则在 Linux 中常与 `grep``sed``awk` 等命令搭配使用。
常见场景:
- 匹配日志中的特定格式
- 过滤 IP、端口、用户名等文本
- 批量替换字符串
- 校验输入格式
## 2、基本字符匹配
### 2.1 `.`
- `.`:匹配任意单个字符
示例:
```shell
a.c
```
可以匹配:`abc``a1c``a-c`
### 2.2 `[]`
- `[]`:匹配指定范围中的任意单个字符
示例:
```shell
[0-9]
[a-z]
[A-Z]
```
### 2.3 `[^]`
- `[^...]`:匹配不在指定范围内的任意单个字符
示例:
```shell
[^0-9]
```
表示匹配任意一个非数字字符。
## 3、匹配次数
### 3.1 `*`
- `*`:匹配前一个字符 **0 次或多次**
示例:
```shell
ab*c
```
可以匹配:`ac``abc``abbc`
### 3.2 `.*`
- `.*`:匹配任意长度的任意字符
这个组合在日志处理里非常常见。
### 3.3 `?`
在基本正则中通常写作 `\?`,表示:
- 前一个字符 **0 次或 1 次**
### 3.4 `+`
在基本正则中通常写作 `\+`,表示:
- 前一个字符 **至少 1 次**
### 3.5 `{}`
在基本正则中通常写作转义形式:
- `\{n\}`:前一个字符恰好出现 `n`
- `\{m,n\}`:前一个字符出现 `m``n`
- `\{,n\}`:前一个字符最多出现 `n`
- `\{n,\}`:前一个字符至少出现 `n`
## 4、位置锚定
- `^`:行首
- `$`:行尾
- `^$`:空行
示例:
```shell
^root
```
表示匹配以 `root` 开头的行。
```shell
bash$
```
表示匹配以 `bash` 结尾的行。
## 5、分组与或关系
### 5.1 `\|`
在基本正则中,`\|` 表示“或者”。
示例:
```shell
root\|admin
```
表示匹配 `root``admin`
### 5.2 `()`
在扩展正则中,分组通常使用 `()`;在部分基本正则工具中可能需要转义。
## 6、基本正则与扩展正则
### 6.1 基本正则 BRE
常见于:
- 默认 `grep`
- 默认 `sed`
其中 `?``+``{}``|` 往往要写成转义形式。
### 6.2 扩展正则 ERE
常见于:
- `grep -E`
- `egrep`
- `sed -r`
扩展正则写法更自然,例如:
```shell
grep -E 'root|admin' file.txt
```
## 7、常见示例
### 7.1 匹配空行
```shell
grep '^$' file.txt
```
### 7.2 匹配注释行
```shell
grep '^#' file.txt
```
### 7.3 匹配数字
```shell
grep '[0-9]' file.txt
```
### 7.4 匹配以 `.log` 结尾的文件名
```shell
grep '\.log$' file.txt
```
## 8、小结
- 正则表达式用于描述字符串匹配规则
- `.``[]``*``^``$` 是最基础也是最高频的元字符
- BRE 和 ERE 的主要区别在于部分符号是否需要转义
- 学会正则后,`grep``sed``awk` 的能力会明显提升