开发者学堂课程【Linux文本处理、正则表达式与Vim:正则表达式基础】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/592/detail/8352
正则表达式基础
内容介绍
一、 正则表达式基本介绍
二、 基本正则表达式元字符
三、 匹配次数
四、 位置查找
五、 分组
一、正则表达式基本介绍
REGEXP:
Reqular Expressions ,它的使用与前面所说的通配符相似,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。
程序支持:
green,sed,awk,vim,less,nginx,varnish 等,只要应用的功能比较强大,通常就会支持正则表达式,甚至连 Windows 中 也支持
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep-E,egrep
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions )
元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex
在 Windows 中查看正在连接主电脑的电脑的方法:
打开 cmd,在 cmd 中输入netstat -n,结果如下图,其中本地地址即为主电脑的IP地址,外部地址就是连接在主电脑上的 IP 地址。
现查找 IP 地址中包括250的方法:
在 cmd 中输入 netstat -n | findstr 250,结果如下图
二、基本正则表达式元字符
字符匹配
.匹配任意单个字符
Ⅱ匹配指定范围内的任意单个字符,示例:[wang][0-9][a-z][a-zA-Z]
[^]匹配指定范围外的任意单个字符
[:alnum:]字母和数字
[:alpha:]代表任何英文大小写字符,亦即A-Z,a-z
[:lower:]小写字母[:upper:]大写字母
[:blank:]空白字符(空格和制表符)
[space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrt:]不可打印的控制字符(退格、删除、警铃...
[:digit:]十进制数字][xdigit:]十六进制数字
[:graph:]可打印的非空白字符
[:print:]可打印字符
[:punct:]标点符号
(1)演示案例
示例1:
表示选择含有在1~3之间的位置:
[root@centos7 ~]#grep
“[1-3]” /etc/passwd
演示结果:
示例2:
表示选择不含有在1~3之间的位置(-v表示取反):
[root@centos7 ~]#grep -v
“[1-3]” /etc/passwd
示例3:
表示选择不包括有在1~3的位置:
[root@centos7 ~]#grep
“[^1-3]” /etc/passwd
演示结果:
(红色表示匹配的字符,表示包含除了123的其他字符)
示例1:
现需要显示 IP 地址:
运行:[root@centos7 ~]#ifconfig eth0
(可以显示出带有IP地址的所有内容)
演示结果:
eth0:flags=4163<UP,BR0ADCAST,RUNNING,MULTICAST>mutton
inet 192.168. 34.7 netmask 255.255. 255.0 broadcast 192.168.34. 255
inet6fe80x :20c:29ff:fe71: 55b3prefixlen64scopeid0x20 <1imlo
ether 00:0c:29:71:55: b3txqueuelen 1000(Ethernet)
RX packets 42285 bytes 14532868(13,8MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 34814 bytes 7615961(7,2MiB)
TX errors 0 dropped 0 overruns 0carrier0collisions 0
改进1:
[root@centos7 ~]#ifconfig eth0|grep netmask
(可以显示出带有IP地址的所在行)
运行结果:
inet 192. 168. 34. 7 netmask 255. 255. 255.0 broadcast 192. 168. 34. 255
改进2:
[root@centos7 ~]#ifconfig eth0 | grep netmask | grep -o
’[[:digit:].] ’
(只显示IP地址)
注意:[[:digit:].]的写法与 [0-9.]写法是等价的。
运行结果:
192.168. 34 255. 255. 255.0 192. 168. 34. 255
三、匹配次数
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*匹配前面的字符任意次,包括0次.例如 a*,表示对 a 的出现的次数不定(包括零次),0个 a 就是‘ ’,一个 a 就是 a ,两个 a 就是 aa,三个 a 就是 aaa……
贪婪模式:尽可能长的匹配
.*任意长度的任意字符。
\?匹配其前面的字符0或1次
\+匹配其前面的字符至少1次
\{n}匹配前面的字符 n 次
\{m,n}匹配前面的字符至少 m 次,至 多 n 次
\{n\3}匹配前面的字符至多 n 次
\{n\}匹配前面的字符至少 n 次
(1)示例:
将下列代码写入文件中去:
[root@centos7~]#cat>f1
google
goooooooooooooogle
gogle
ggle
g0000ooooooole
^C
[root@centos7~]]#cat f1
google
goooooooooooooogle
gogle
ggle
g0000ooooooole
现想查询代码中 o 的个数,由 于 o 不确定的个数,则需要运行以下代码:
1.查找至少含有0个 o 的个数
[root@centos7 ~]#grep
“go*gle“ f1
运行结果如下:
google
goooooooooooooogle
gogle
ggle
2.查找至少含有2个 o 的个数
[root@centos7 ~]#grep
“gooo*gle“ f1
运行结果如下:
google
goooooooooooooogle
3. .*任意字符
[root@centos7 ~]#grep
“g.*gle“ f1
运行结果如下:
google
4. \?匹配其前面的字符0或1次
[root@centos7 ~]#grep
“go\?gle“ f1
运行结果如下:
gogle
ggle
5.\+匹配其前面的字符至少1次
[root@centos7 ~]#grep
“go\+gle“ f1
运行结果如下:
google
goooooooooooooogle
gogle
6. \{n}匹配前面的字符 n 次
[root@centos7~]#grep
“go\{14\}gle“ f1
运行结果如下:
goooooooooooooogle
7.\{m,n}匹配前面的字符至少 m 次 n 次
6. \{n}
“go\{14\}gle次
运行结果如下:
goooooooooooooogle
7.\{m,n}匹配前面的字符至少 m 次,至多 n 次
6. \{n}匹配前面的字符n次
8.\{n\3}匹配前面的字符至多 n 次
[root@centos7~]#grep
“go\{,14\}gle“ f1
运行结果如下:
goooooooooooooogle
8.\{n\3}匹配前面的字符至多 n 次
[root@centos7~]#grep
“go\{,14\}gle“ f1
运行结果如下:
9.\{n\}匹配前面的字符至少 n 次
[root@centos7~]#grep
“go\{2,\}gle“ f1
运行结果如下:
google
goooooooooooooogle
演示:
先将 I P 地址显示出来输入:
运行:[root@centos7 ~]#ifconfig eth0
演示结果:
eth0:flags=4163<UP,BR0ADCAST,RUNNING,MULTICAST>mutton
inet 192.168. 34.7 netmask 255.255. 255.0 broadcast 192.168.34. 255
inet6fe80x :20c:29ff:fe71: 55b3prefixlen64scopeid0x20 <1imlo
ether 00:0c:29:71:55: b3txqueuelen 1000(Ethernet)
RX packets 42285 bytes 14532868(13,8MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 34814 bytes 7615961(7,2MiB)
TX errors 0 dropped 0 overruns 0carrier0collisions 0
然后在上述结果中选取一位到三位之间的数字,
运行:[root@centos7 ~]#ifconfig eth0 | grep “[0-9]\{1,3\}“
演示结果如下图所示:(红色表示所筛选出的结果)
因为所包含的贪婪模式,会进一步读取到千位,所以要想单个输入对应的字符则需要将代码改写成:[root@centos7~]#ifconfig eth0 | grep -o “[0-9]\{1,3\}“
运行:[root@centos7 ~]#ifconfig eth0 | grep -o “[0-9]\{1,3\}.[0-9]\{1,3\}. [0-9]\{1,3\}. [0-9]\{1,3\}. “
演示结果:
192.168.34.7
255.255.255.0
192.168.34.255
14667367
7749514
注意:最后两行的出现是由于代码中的“.“,需要用到转义字符”\“,需要对代码进行改进
改进1:
运行:
[root@centos7~]#ifconfig eth0 | grep -o
“[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}. “
演示结果:
192.168.34.7
255.255.255.0
192.168.34.255
改进2;(只提取第一行的IP地址)
运行:[root@centos7 ~]#ifconfig eth0 | grep -o “[0-9]\{1,3\}.[0-9]\{1,3\}. [0-9]\{1,3\}. [0-9]\{1,3\}. “ |head -n1
演示结果:
192.168.34.7
四、位置查找
位置锚定:定位出现的位置
^行首锚定,用于模式的最左侧
行尾锚定,用于模式的最右侧
^PATTERN$用于模式匹配整行
^空行
^[[space:]]*$空白行
\<或\b词首锚定,用于单词模式的左侧
\>或\b词尾锚定,用于单词模式的右侧
\<PATTERN>匹配整个个单词
(1)示例:
1. ^行首锚定,用于模式的最左侧
运行:[root@centos7 ~]#grep “^root“ /etc/passwd
演示结果:
root:x:0:0:root:/root:/bin/bash
rooter:x:1003:1005::/home/rooter:/bin/bash
2. $行尾锚定,用于模式的最右侧
运行:[root@centos7~]#grep"bash$"/etc/passwd
演示结果:~
root:x:0:0:root:/root:/bin/bash
wang:x:1000:1000:wang:/home/wang:/bin/bash
mage:x:1001:1001::/home/mage:/bin/bash
zhang:x:1002:1003::/home/zhang:/bin/bash
rooter:x:1003:1005::/home/rooter:/bin/bash
adroot:x:1004:1006::/home/adroot:/bin/bash
rooooter:x:1005:1007::/home/rooooter:/bin/bash
roooter:x:1006:1008::/home/roooter:/bin/bash
3.演示:
[root@centos7~]#cat f1
google
google google goooooooooooooole
gogle
ggle google
g0000oooooole
gooooole
goooooooooooooooooooole
[root@centos7~]#grep google f1
运行后为:
google
google google goooooooooooooole
ggle google
[root@centos7~]#grep
“^google$” f1
运行后为:
google
[root@centos7~]#cat -A f1(
表示查看空行)
运行后为:
google$
$
google google goooooooooooooole$
gogle$
ggle google$
g0000oooooole$
gooooole$
goooooooooooooooooooole$
[root@centos7~]#grep
–v “^$“ f1(表示查看非空行)
运行后为:
google
google google goooooooooooooole
gogle
ggle google
g0000oooooole
gooooole
goooooooooooooooooooole
4.演示
[root@centos7 ~]#cat /etc/fstab
# /etc/fstab
#Created by anaconda on Wed Sep 19 19:44:23 2018
#
#Accessible filesystems, b
ỵreference, are maintained under /dev/disk'
#See man pages fstab(5), findfs(8), mount(8) and/or b1kid(8) for more info
UUID=89419d13- 8564- 4340- 8650- a360afef1bf7 /. xfs defaults 00
UUID=76255676-990f- 4f0e-963e-bab166b4f3ea /boot xfs defaults 00
UUID=27bf5dd1-cc54-46f0- 896e-f93d3dea68ee data xfs defaults 00
UUID=701416eb-5a4a- 4b3f-b713-a5a291829329 swap xfs defaults 00
[root@centos7 ~]#grep
“^#” /etc/fstab
# /etc/fstab
#Created by anaconda on Wed Sep 19 19:44:23 2018
#
#Accessible filesystems, b
ỵreference, are maintained under /dev/disk'
#See man pages fstab(5), findfs(8), mount(8) and/or b1kid(8) for more info
[root@centos7 ~]#grep -v
“^#” /etc/fstab
UUID=89419d13- 8564- 4340- 8650- a360afef1bf7 /. xfs defaults 00
UUID=76255676-990f- 4f0e-963e-bab166b4f3ea /boot xfs defaults 00
UUID=27bf5dd1-cc54-46f0- 896e-f93d3dea68ee data xfs defaults 00
UUID=701416eb-5a4a- 4b3f-b713-a5a291829329 swap xfs defaults 00
[root@centos7 ~]#grep -v
“^#” “^$” /etc/fstab
grep:^$:No such file or directory
/etc/fstab:
/etc/fstab: UUID=89419d13- 8564- 4340- 8650- a360afef1bf7 /. xfs defaults
/etc/fstab: UUID=76255676-990f- 4f0e-963e-bab166b4f3ea /boot xfs defaults
/etc/fstab: UUID=27bf5dd1-cc54-46f0- 896e-f93d3dea68ee data xfs defaults
/etc/fstab: UUID=701416eb-5a4a- 4b3f-b713-a5a291829329 swap xfs defaults
[root@centos7 ~]#df
aeraurus oo
LDoucents/~
Filesystem 1K-blocks used Available Use% Mounted on
/dev/sda2 52403200 35782 4848824952 7 % /
devtmpfs 916724 0 916724 0% /dev
tmpfs 932652 0 932652 0% /dev/shm
tmpfs 932652 10632 922020 2 % /run
tmprs 932652 0 932652 0% /sys/fs/cgroup
/dev/ sda 331441920 33000 31408920 1 % /data
/dev/ sda 11038336 168556 869780 17 % /boot
tmpfs 186532 32 186500 1 % /run/user/0
/dev/sr 09176232 9176232 0 100 % /run/media/root/centos 7x86_ 64
示例:查询以 root 为词首的单词
[root@centos7~]# grep
“\<root” /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rooter:x:1003:1005::/home:/rooter:/bin/bash:
[root@centos7~]# grep
“root\>” /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rooter:x:1003:1005::/home:/rooter:/bin/bash:
注意:单词是指连续的字符前面不能是数字,字母、下划线等不可以作为单词的分隔符
并且‘\<’与’\b’相同,’\>’与’\b’相同
五、分组
分组:\(\)将一个或多个字符捆绑在一起,当作一个整体处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,...
\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例:(sftyring1\+\(string 2\)*\)
\1:string1\+\(string2\)
\2:string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:
示例:a\|b:a 或 b C\|cat: C 或 cat \(C\|c\) at:Cat 或 cat
(1)演示示范:
[root@centos7 ~]#cat >f1
abcabc
abcabcabc
abc
^C
[root@centos7 ~]#cat f1
abcabc
abcabcabc
abc
//
表示连续的 abc 出现三次
[root@centos7 ~]#grep
“\(abc\)\{3\}” f1
abcabcabc
[root@centos7 ~]#grep
“abc\{3\}” f1
[root@centos7 ~]#echo abccc >> f1
> ^c
[root@centos7 ~]#echo abccc >> f1
[root@centos7 ~]#grep
“abc\{\3}”f1
//
运行
abccc
//
增加以下字符
[root@centos7 ~]#cat >> f1
abc abc
abc
^C
[root@centos7 ~]#cat f1
abcabc
abcabcabc
abc
abccc
abc abc
abc
[root@centos7 ~]#grep
“\(abc\).*\1” f1
//
运行
abcabc
abcabcabc
abc abc
[root@centos7 ~]#cat > f1
xyz zyx
abc xyz abc xyz
^c
[root@centos7 ~]#cat f1
xyz zyx
abc xyz abc xyz
[root@centos7 ~]#grep
“\(abc\).*\(xyz\).*\1” f1
//
运行
abc xyz abc xyz
[root@centos7 ~]#grep
“\(abc\).*\(xyz\).*\2” f1
abc xyz abc xyz
[root@centos7 ~]#echo 123ab123xxy123 >f1
[root@centos7 ~]cat f1
123ab123xxy123
[root@centos7 ~]#cat f1 |grep
“\(123\).*\1”
123ab123xxy123
[root@centos7 ~]#cat f1
123ab123xxy123
234xxx567
[root@centos7 ~]#cat f1 | grep
“\([0-9]\){3\}”
123ab123xxy123
234xxx567
[root@centos7 ~]#cat f1 | grep
“\([0-9]\){3\}.*\1”
123ab123xxy123
[root@centos7 ~]#cat 567aaa567 >>f1
cat:567aaa567:No such file or directory
[root@centos7 ~] #echo 567aaa567 >>f1
[root@centos7 ~]#cat f1 | grep
“\([0-9]\){3\}.*\1”
123ab123xxy123
567aaa567
[root@centos7 ~]#grep
“^(a\|b)”/etc/passwd
[root@centos7 ~]#grep
“^\(a\|b)”/etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
adroot:x:1004:1006::/home/adroot:/bin/bash
[root@centos7~1#grep -E
“^(a|b)” /etv/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
adroot:x:1004:1006::/home/adroot:/bin/bash
[root@centos7 ~]#ifconfig
eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500
inet 192.168.34.7 netmask 255.255.255.0 broadcast 192.168.34.255
inet6 fe80::20c:29ff:fe71:55b3 prefixlen 64 scopeid 0x20<1ink>
ether 00:0c:29:71:55: b3 txqueuelen 1000(Ethernet)
RX packets 45986 bytes 14978482(14.2MiB)
RX errors 0 dropped 0 overruns 0 frame 0 TX packets 37482`bytes 8048294(7.6MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500
inet 172. 16. 251. 30 netmask 255. 255.0.0 broadcast 172. 16. 255. 255
inet6 fe80:5b87:e9b5:19b0:3024 _ prefixlen 64 scopeid0x20 <link>
ether 00:0c:29:71:55:bd toxqueuelen 1000 (Ethernet)
RX packets 168364 bytes 16280566(15.5 MiB)
RX errors 0 dropped^0 overruns 0 frame 0
TX packets 593 bytes 54029(52.7KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo:f1ags=73<UP,LOOPBACK,RUNNING>mtu65536
inet 127.0.0.1 netmask 255.0.0.0
inet
ó::1 prefixlen 128 scopeid0x10 <host>
loop txqueuelen 1000(Local Loopback)
RX packets 110 bytes 12104(11.8KiB)
Rx errors 0 dropped 0 overruns 0 firame 0
TX packets 110 bytes 12104(11.8kiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
现在将代码中得 IP 地址提取出来
[root@centos7 ~]#ifconfig eth0[root@centos7]#ifconfig"eth0
eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mu1500
inet 192. 168. 34.7. netmask 255. 255.0. broadcast 192. 168. 34. 255
inet6fe80::20c:29ff:fe71: 55b3prefixlen64scopeid0x20 <Iink>
ether 00:0c:29:71:55: b3txqueuelen 1000(Ethernet)
RX packets 46088 bytes 14991882(14.2MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 37578 bytes 8086326(7.7MiB)
Tx errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@centos7~]# ifconfig eth0Igrep "\([0~9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"
inet 192.168.34.7netmask255 , 255. 255:0 broadcast 192.168.34.255
[root@centos7~]# ifconfig eth0 | grep -o"\([0-9]\{1,3\}\.\{3}{[0-9]\{1,3\}"
192. 168. 34.7
255. 255. 255.0
192. 168. 34. 255
[root@centos7~]#ifconfig eth0|grep-o"\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}" |head -1
192. 168. 34.7