90 lines
4.7 KiB
Markdown
90 lines
4.7 KiB
Markdown
<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` → 独立单词 |
|
||
|