shell/shell-正则.md
2025-03-28 20:10:14 +08:00

90 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

<h2><center>Shell 正则</center></h2>
------
## 一:正则表达式
### 1. 正则应用环境
重要的文本处理工具vim、sed、awk、grep
各种语言和应用程序: mysql、oracle、php、python、Apache、Nginx ...
### 2. 正则介绍
正则表达式Regular Expression通常简称为 regex 或 RE是一种字符表达方式可以用它来查找匹配特定准则的文本。在许多编程语言中都有用到正则表达式常用它来实现一些复杂的匹配。这里简单介绍一下 shell 中常用到的一些正则表达式。
正则表达式是对字符串进行操作的一种逻辑公式即用事先定义好的的一些特定字符以及这些特定字符的组合组成一个有一定规则的字符串Regular Expression使用这个有一定规则的字符串来表达对字符串的一种过滤逻辑。正则表达式被广泛应用于Linux和许多其他编程语言中而且不论在哪里其基本原理都是一样的。
正则表达式是由两个基本组成部分所建立:一般字符与特殊字符。一般字符是指没有任何特殊意义的字符;特殊字符,常称为元字符 metacharacter或 meta 字符,正则表达式将匹配被查找行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。在某些情况下,特殊字符也可被视为一般字符(使用转义符 \ 进行转义)。
POSIX 有两种风格的正则表达式基本正则表达式BRE和扩展正则表达式ERE。这两种风格的正则表达式在一些字符含义上有细微的差距。以常用的 grep 指令来说grep 指令默认支持的是 BRE若要使用 ERE 进行匹配,可以使用 -E 选项,接下来的例子中均使用 grep 指令来演示正则表达式的使用。
案例:
```shell
匹配数字: ^[0-9]+$
匹配Mail [a-z0-9_]+@[a-z0-9]+\.[a-z]+
匹配IP [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
[root@wxin ~]# egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.159.130
GATEWAY=192.168.159.2
NETMASK=255.255.255.0
DNS1=192.168.159.2
```
### 3. 元字符
- shell 元字符(也称为通配符)
- 正则表达式元字符
案例:
```bash
[root@wxin ~]# rm -rf *.pdf
[root@wxin ~]# grep 'abc*' /etc/passwd
abrt:x:173:173::/etc/abrt:/sbin/nologin
```
### 4. 正则表达式元字符
#### 1. 基础元字符
| 元字符 | 作用 | 示例 |
| :----: | :------------------------------------------------------: | -------------------------- |
| `.` | 匹配任意单个字符 | `a.c``"abc""a1c"` |
| `^` | 匹配行开头 | `^start`→行以`"start"`开头 |
| `$` | 匹配行结尾 | `end$` → 行以 "end" 结尾 |
| `[]` | 匹配字符组中的任意一个字符 | `[aeiou]` → 任意元音字母 |
| `[^]` | 匹配不在字符组中的任意一个字符 | `[^0-9]` → 非数字字符 |
| `\` | 转义字符,将元字符转为普通字符,或将普通字符转为特殊功能 | `a\.b` → 字面量 `"a.b"` |
#### 2. 量词元字符
| 元字符 | 作用 | 示例 |
| :-----: | :------------------------: | :---------------------------: |
| `*` | 前字符出现 **0 次或多次** | `a*b` → "b", "ab", "aaab" |
| `+` | 前字符出现 **1 次或多次** | `a+b` → "ab", "aaab" |
| `?` | 前字符出现 **0 次或 1 次** | `colou?r` → "color", "colour" |
| `{n,m}` | 前字符出现 **n 到 m 次** | `a{2}` → "aa" |
#### 3. 分组与逻辑
| 元字符 | 作用 | 示例 |
| :----: | :------------------: | :-----------------------: |
| `()` | **分组**,捕获子模式 | `(ab)+` → "ab", "abab" |
| `|` | **逻辑或** | `at|dog` → "cat" 或 "dog" |
#### 4. 预定义字符类
| 元字符 | 作用 | 示例 |
| :----: | :------------------------: | :-------------------: |
| `\d` | 数字(部分工具支持) | `\d+` → "123" |
| `\w` | 单词字符(字母数字下划线) | `\w+` → "hello123" |
| `\s` | 空白字符(空格、制表符等) | `\s+` → 匹配空白 |
| `\b` | 单词边界 | `\bword\b` → 独立单词 |