正则表达式的简单实例

正则表达式的简单实例

正则表达式概念

正则表达式,又称规则表达式。(英语:Regular
Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。


元字符

^ 行首
$ 行尾
. 任意单一字符
[] []内任意单一字符
[^] 除[]内任意单一字符
* *前面字符重复不确定次数
+ +前面字符重复一次以上不确定次数
\? ?前面字符重复0或1次
\ 转义符
.* 任意长度字符
{n} 前面字符重复n次
{n,} 前面字符重复n次以上
{m,n} 前面字符重复m次和n次之间
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 水平空白字符(空格和制表符)
[:space:] 所有水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
[:digit:] 十进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[:xdigit:] 十六进制数字


实例

正则表达式如果单纯只是通过元字符来了解的话是非常抽象的,所以在我们学习正则表达式的过程中最重要的就是实例,实例往往可以直观地展示每个元字符的作用和功能。

那么下面我就举两个实例来讲解正则表达式的用法。

1.利用df和grep,取出磁盘各分区利用率,并从大到小排序

首先运行一次df查看磁盘各分区利用率的位置

[root@centos7 ~]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2      104806400 4807420  99998980   5% /
devtmpfs          485308       0    485308   0% /dev
tmpfs             499980       4    499976   1% /dev/shm
tmpfs             499980    7188    492792   2% /run
tmpfs             499980       0    499980   0% /sys/fs/cgroup
/dev/sda3       52403200   32944  52370256   1% /app
/dev/sda1        1038336  172116    866220  17% /boot
tmpfs             100000       8     99992   1% /run/user/0
[root@centos7 ~]# 

然后观察磁盘分区利用率的特点,从上面我们可以看到磁盘利用率后面一定有个百分号,那么我们可以从这个地方入手搜索。

[root@centos7 ~]# df | grep -o "\<[[:digit:]]\+%"
5%
0%
1%
2%
0%
1%
17%
1%
[root@centos7 ~]# 

执行上面的命令后可以看到磁盘利用率已经取出来了,但是顺序还有点乱,这个问题稍后再解决。

“\<[[:digit:]]+%”在这个正则表达式中,“\<”的意思是单词开头,用这个的意义在于防止匹配到磁盘利用率前面的数字;”[[:digit:]]”的意思比较明确,指的是0-9的任意一个数字,后面的”+”的意思是前面的数字重复至少一次及以上,因为观察可以知道磁盘利用率都是一位到两位之间的数字;后面的百分号表示的就是匹配磁盘利用率结尾的百分号。

通过这个正则表达式就能准确找打匹配的值。

至于顺序问题我们可以用sort命令解决。

[root@centos7 ~]# df | grep -o "\<[[:digit:]]\+%" | sort -nr
17%
5%
2%
1%
1%
1%
0%
0%
[root@centos7 ~]# 

如上,这样就完成题目的要求。


2.找出/etc/passwd中的两位或三位数

遇到此类问题第一步就是先看看我们要找的内容处于为什么位置有什么特点,这才能帮助我们用合适的正则表达式准确地找到目标。

首先查看一下/etc/passwd文件

[root@centos7 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
。。。
中间省略多行
。。。
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS 
tcpdump:x:72:72::/:/sbin/nologin
[root@centos7 ~]# 

很明显,在这个文件中的数字就是用户的UID和GID,那么可以直接搜索数字目标。

[root@centos7 ~]# grep -o "\<[0-9]\{2,3\}\>" /etc/passwd
12
11
12
100
中间省略多行
38
38
72
72
[root@centos7 ~]# 

如上实验所示,我们通过一段简单的命令便轻松解决了题目上的问题,那么这段命令如何理解呢?

grep -o 中-o选项是为了只显示匹配到的字符。

“\<[0-9]{2,3}>”正则表达式中和实验1一样我们用到了限定词首的“\<”,然后后面的“0-9”和”[:digit:]”意思相同,“{2,3}”是表示前面的字符重复次数再两次以上三次以下,也就是限定数字的位数在两位到三位之间;但是我们可以看到实验2中比实验1中多了一个限定词尾的”>”,因为观察/etc/passwd文件中的数字可以看到有如65534这样的数字,如果不限定词尾的话那么只要是开头有两位到三位数字的数字就能成功匹配上,那么就出错了。


结语

通过上面两个实例,是否对正则表达式又多了一些新的理解呢?

正则表达式是一个非常注重细节的规则,在我学习正则表达式的过程中发现要熟悉并且灵活运用正则表达式需要多多练习,处理的问题越多就越能灵活运用正则表达式,对正则表达式的理解也会更加深入。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页