4.7 KiB
4.7 KiB
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 指令来演示正则表达式的使用。
案例:
匹配数字: ^[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 元字符(也称为通配符)
- 正则表达式元字符
案例:
[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" |
` | ` | 逻辑或 |
4. 预定义字符类
元字符 | 作用 | 示例 |
---|---|---|
\d |
数字(部分工具支持) | \d+ → "123" |
\w |
单词字符(字母数字下划线) | \w+ → "hello123" |
\s |
空白字符(空格、制表符等) | \s+ → 匹配空白 |
\b |
单词边界 | \bword\b → 独立单词 |