Shell 正则

------ ## 一:正则表达式 ### 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` → 独立单词 |