什么是正则表达式?
正则表达式(Regular expression)是一种字符模式,用于在查找过程中匹配指定的字符。
匹配数字:^[0-9]+$
比如:123 456
例
[root@localhost ~]# num1=123
[root@localhost ~]# num2=456
[root@localhost ~]# num3=7w9
[root@localhost ~]# [[ "$num1" =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes
[root@localhost ~]# [[ "$num2" =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes
[root@localhost ~]# [[ "$num3" =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
no
匹配mail:[a-z0-9_]+@[a-z0-9]+\.[a-z]+
比如:ls12345666@qq.com
匹配IP:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
例:
[root@localhost ~]# 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.1.11
GATEWAY=192.168.1.2
DNS1=114.114.114.114
正则表达式元字符
定义:元字符是这样一类字符,它们表达的是不同于字面本身的含义
shell元字符(也称通配符) 由Shell来解析,如 rm -rf *.txt
, 元字符 *
Shell将其解析俄日任意多个字符
正则表达式元字符 由各种执行模式匹配操作的程序类解析,比如vi、grep、sed、awk、python
基本正则表达式元字符
元字符 | 功能 | 示例 |
---|---|---|
^ | 行首定位符 | ^love |
$ | 行尾定位符 | love$ |
. | 匹配单个字符 | l..e |
* | 匹配前导符0到多次 | ab*love |
.* | 任意多个字符 | |
[] | 匹配指定范围内的一个字符 | [lL]ove |
[ - ] | 匹配指定范围内的一个字符 | [a-z0-9]ove |
[ ^ ] | 匹配不在指定组内的字符 | [^a-z0-9]ove |
\ | 用来转义元字符 | love. |
\< | 词首定位符 | \<love |
> | 词尾定位符 | love> |
(..) | 匹配稍后使用的字符标签 | |
x{m} | 字符x重复出现m次 | a{5} |
x{m,} | 字符x重复出现m次以上 | a{5,} |
x{m,n} | 字符x重复出现m到n次 | a{5,10} |
扩展正则表达式元字符
元字符 | 功能 | 示例 |
---|---|---|
+ | 匹配一个或多个前导字符 | [a-z]+ove |
? | 匹配零个或一个前导字符 | lo?ve |
a丨b | 匹配a或者b | love丨hate |
() | 组字符 | loveable\rs love(able丨rs)ov+ (ov)+ |
()()1\2 | 标签匹配字符 | (love)able\1er |
x{m} | 字符x重复m次 | a{5} |
x{m,} | 字符x重复至少m次 | a{5,} |
x{m,n} | 字符x重复m到n次 | a{5,10} |
POSIX字符类
表达式 | 功能 | 示例 |
---|---|---|
[:alnum:] | 字母与数字 | [[:alnum:]]+ |
[:alpha:] | 字母 | [[:alpha:]]{4} |
[:blank:] | 空格与制表符 | [[:blank:]]* |
[:digit:] | 数字字母 | [[:digit:]]? |
[:lower:] | 小写字母 | [[:lower:]]{5,} |
[:upper:] | 大写字母 | [[:upper:]+ |
[:punct:] | 标点符号 | [[:punct:] |
[:space:] | 包括换行符,回车等在内的所有空白 | [[:space:]]+ |
例子:
[root@localhost ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
shuai:x:1000:1000:shuai:/home/shuai:/bin/bash
[root@localhost ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]# grep 'ro*t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
[root@localhost ~]# grep '.*' /etc/passwd
# 会显示/etc/passwd文件所有内容
[root@localhost ~]# grep 'Root' /etc/passwd
[root@localhost ~]# grep '[Rr]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep '[a-z]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
setroubleshoot:x:990:984::/var/lib/setroubleshoot:/sbin/nologin
[root@localhost ~]# grep '[^0-9]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
setroubleshoot:x:990:984::/var/lib/setroubleshoot:/sbin/nologin
[root@localhost ~]# grep '\<root\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep 'ro\{2\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep 'ro\{2,\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep 'ro\{2,5\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
练习
1.匹配手机号
如:18601236789
[0-9]{11}
2. 匹配中国座机号
如:022-54673286、0123-8310573
[0-9]{3,4}\-[0-9]{7,8}
匹配一个0~999之间的任意数字
^[1-9]{0,3}|0$
选出含有ftp的链接,且文件类型是gz或者xz的文件名
^(ftp://).*(gz|xz)$