开发者学堂课程【Linux 文本处理、正则表达式与 Vim:扩展正则表达式】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/592/detail/8353
扩展正则表达式
内容介绍
一、egrep 及扩展的正则表达式
二、次数匹配
三、例题演示
一、egrep 及扩展的正则表达式
egrep=grep-E
egrep[OPTIONS]PATTERN[FILE...]
扩展正则表达式的元字符:
字符匹配:
.任意单个字符
]指定范围的字符
[^]不在指定范围的字符
二、次数匹配
*匹配前面字符任意次
? 0或1次
+ 1次或多次
{m}匹配 m 次
{m,n}至少 m,至多 n 次
位置锚定:
IA 行首
行尾
\<,\b 语首
\>,\b 语尾
分组:
0
后向引用:\1,\2,..
或者:
a|b a 或 b
C|cat C 或 cat
(C|c)at Cat 或 cat
三、例题演示
(1)练习一:使用 egrep 取出 /etc/rc.d/init.d/functions 中其基名
[root@centos7 ~]#basename /etc/rc.d/init.d/functions
functions
//
目名
[root@centos7 ~]#dirname /etc/rc.d/init.d/functions
/etc/rc.d/init.d
//
只取基名,grep可以进行行过滤,o 选项是匹配正则表达式的选项
[root@centos7 ~]#echo
”/etc/rc.d/init.d/functions” |grep -Eo “[^/]+”
//
运行
etc
rc.d
init.d
functions
[root@centos7 ~]#echo
”/etc/rc.d/init.d/functions” |grep -Eo “[^/]+$”
//
运行
functions
[root@centos7 ~]#echo
”/etc/rc.d/init.d/functions” |grep -o “[^/]\+$”
//
运行
functions
[root@centos7 ~]#echo
”/etc/rc.d/init.d/functions” |grep -Eo “.*/”
//
运行
/etc/rc.d/init.d/
[root@centos7 ~]#echo
”/etc/rc.d/init.d/functions”
//
运行
/etc/rc.d/init.d/
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*/”
//
运行
/etc/rc.d/init.d/
[root@centos7 ~]#dirname /etc/rc.d/init.d/
//
运行
/etc/rc.d
[root@centos7 ~]#echo
”/etc/rc.d/init.d” |grep -Eo “.*/”
//
运行
/etc/rc.d/
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*/”
//
运行
/etc/rc.d/init.d/
上述运行结果:
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*/.*[^/]?”
//
运行
/etc/rc.d/init.d/
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*/.*[^/]”
//
运行
/etc/rc.d/init.d
[root@centos7 ~]#echo
”/etc/rc.d/init.d” |grep -Eo “.*/.*[^/]”
//
运行
/etc/rc.d/init.d
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*/.*[^/]”
//
运行
/etc/rc.d/init.d
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*/.*[^/]” | grep -Eo “.*/”
//
运行
/etc/rc.d/
[root@centos7 ~]#echo
”/etc/rc.d/init.d” |grep -Eo “.*/.*[^/]”|grep -Eo “.*/”
//
运行
/etc/rc.d/
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*/.*[^/]”
//
运行
/etc/rc.d/init.d
[root@centos7 ~]#echo
”/etc/rc.d/init.d” |grep -Eo “.*/.*[^/]”
//
运行
/etc/rc.d/init.d/
[root@centos7 ~]#echo
”/etc/rc.d/init.d” |grep -Eo “.*[^/]”
//
运行
/etc/rc.d/init.d
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*[^/]”
//
运行
/etc/rc.d/init.d
[root@centos7 ~]#echo
”/etc/rc.d/init.d/” |grep -Eo “.*[^/]”| grep -Eo “.*/”
//
运行
/etc/rc.d/
上述代码多次实验的结果
(2)练习二:利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255,显示ifconfig命令结果中所有IPv4地址
//
显示IP
[root@centos71#ip a
1:lo:<LOOPBACK,
υD,LOwER_UP>mtu 65536, qdisc noqueue state UNKMOWN group default qlen 1000
link/ loopback 00 :00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid _ lft forever preferred _ lft forever
inet6 ::1/128 scope host
valid _ lft forever preferred _ lft forever
2:eth0: <BROADCAST ,MULTICAST,UP,LOMER_UP> mtu 1500 qdisc pfifo_fast state up group default qlen 1000
link/ether 00:0c:29:71:55:bd brd ff:ff:ff:ff:ff:ff
inet 192. 168. 34.7/24 brd 192. 168. 34. 255 scope global noprefixroute eth0
valid _lft forever preferred _lft forever
inet6fe80::20c:29ff:fe71:55b3/64 scope link
valid_lftforever preferred_lftforever
3
:eth1: <BROADCAST ,MULTICAST,UP,LOMER_UP> mtu 1500 qdisc pfifo_fast state up group default qlen 1000
link/ether 00:0c:29:71:55:bd brd ff:ff:ff:ff:ff:ff
inet 192. 168. 34.7/24 brd 192. 168. 34. 255 scope global noprefixroute eth1
valid _lft forever preferred _lft forever
inet6fe80::20c:29ff:fe71:55b3/64 scope link
valid_lftforever preferred_lftforever
[root@centos7~]#[0-9][[:digig:]]
(2)扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255.
0-9 [0-9]
10-99 [1-9]?[0-9]
100-199 1?[0-9]?[0-9]
200-249 2[0-4][0-9]
250-255 25[0-5]
(3)表示 IP 的范围
(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
[root@centos7 ~]#ifconfig | grep -Eo
”(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])”
//
运行
192.168.34.7
255.255.255.0
192.168.34.255
172.16.0.7
255.255.0.0
172.16.255.255
127.0.0.1
255.0.0.0
扩展正则表达式比较简洁,若本题选用基本正则表达式会过于繁琐,以下为采用基本正则表达式的代码
[root@centos7 ~]#ifconfig | grep -o
”\(\([1-9]\?[0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)\.\){3\}\([1-9]\?[0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)”
//
运行
192.168.34.7
255.255.255.0
192.168.34.255
172.16.0.7
255.255.0.0
172.16.255.255
127.0.0.1
255.0.0.0