14 Shell Script正则表达式
正则表达式
一、正则表达式介绍
正则表达式是一个描述字符串集合的模式/规则
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本、
正则表达式由普通字符和元字符组成
普通字符具有自身的字符意义
元字符具有特殊意义
grep支持两种正则表达式:
基本正则表达式
扩展正则表达式
一)基本正则表达式
元字符分类
匹配操作符
重复操作符
# 测试文本
[root@localhost ~]# cat test.txt
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
oo3xx
oo4xx
ooWxx
oomxx
$ooxx
匹配操作符
\ 转意操作符,恢复元字符原有的字面意义
[root@localhost ~]# grep '\$' test.txt
$ooxx
. 匹配任意单个字符
[root@localhost ~]# grep '..xx' test.txt
ooxx12121212ooxx
ooxx 12121212
1212 ooxx 1212
oo3xx
oo4xx
ooWxx
oomxx
$ooxx
[] []中包含一个字符序列来匹配单个字符
[root@localhost ~]# grep '[123]' test.txt
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
oo3xx
^ 匹配一行字符串的起始位置
[root@localhost ~]# grep '^ooxx' test.txt
ooxx12121212ooxx
ooxx 12121212
$ 匹配一行字符串的结束位置
[root@localhost ~]# grep '\$' test.txt
$ooxx
\< 匹配一个单词的起始位置
[root@localhost ~]# grep 'ooxx\>' test.txt
ooxx12121212ooxx
ooxx 12121212
1212 ooxx 1212
$ooxx
\> 匹配一个单词的结束位置
[root@localhost ~]# grep 'ooxx\<' test.txt
重复操作符
* 重复前面的项零次或多次
[root@localhost ~]# grep 'o*x' test.txt
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
oo3xx
oo4xx
ooWxx
oomxx
$ooxx
二)扩展正则表达式
元字符分类
匹配操作符
重复操作符
对于grep默认执行支持基本正则表达式,如果想使用扩展正则表达式需要使用\转义扩展正则表达式的元字符
[root@localhost ~]# cat test.txt
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
oo3xx
oo4xx
ooWxx
oomxx
$ooxx
匹配操作符
| 连接操作符:或
[root@localhost ~]# grep 'ooxx\|xxoo' test.txt
ooxx12121212ooxx
ooxx 12121212
1212 ooxx 1212
$ooxx
() 选择操作符
[root@localhost ~]# grep '\(12\)' test.txt
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
\n 引用操作符
重复操作符
? 重复前面的项零次或一次
[root@localhost ~]# grep '\(12\)\?' test.txt
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
oo3xx
oo4xx
ooWxx
oomxx
$ooxx
+ 重复前面的项一次或多次
[root@localhost ~]# grep '\(12\)\+' test.txt
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
{n} 重复前面的项n次
[root@localhost ~]# grep 'ooxx\{1\}' test.txt
ooxx12121212ooxx
ooxx 12121212
1212 ooxx 1212
$ooxx
{n,} 重复前面的项n次到多次
[root@localhost ~]# grep 'ooxx\{1,\}' test.txt
ooxx12121212ooxx
ooxx 12121212
1212 ooxx 1212
$ooxx
{n,m} 重复前面的项n次到m次
[root@localhost ~]# grep 'ooxx\{1,2\}' test.txt
ooxx12121212ooxx
ooxx 12121212
1212 ooxx 1212
$ooxx
三)正则表达式实战
正则表达式匹配网址
grep -n '^http://www\.\abcd\.com$' url
正则表达式匹配邮箱地址
# 找出所有合规的邮件地址
grep --color '^[a-zA-Z0-9_]\+[.-]*@[a-zA-Z0-9]\+\.[a-zA-Z]\+' email# 找出所有不合规的邮件地址
grep -E '^[^a-zA-Z0-9_]*@' email
正则表达式匹配IP地址
grep -E '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' ip