00:00
到目前为止,关于shell编程这一部分我们基本上就都介绍完毕了,我们现在就可以使用各种各样的知识去书写自己的shell脚本,然后去进行自动化的一些流程操作了。啊,那这一部分呢,我们接下来还要做一个扩展,那就是传说中的正则表达式啊,其实我们也知道,正则表达式跟shell编程可以说是有千丝万缕的联系,因为在shell当中,我们往往都需要对于文本或者字符串做各种各样的剪切、拼接操作,比如说之前我们刚刚做完的这一个脚本啊,呃,我们做这个。每天做的这个归档操作,我们就会发现里边去截取当前的目录名称啊,包括我们去拼接当前的文文件的名称,哎,各种各样的操作往往都是针对一个字符串来进行的,这里我们是比较简单,所以使用base name还有dina就可以非常快速的对我们想要的内容做一个节选。
01:02
啊,但是有些时候呢,可能就没那么简单了,可能就要进行一些非常复杂的操作,这个时候又怎么办呢?哎,那这时我们就可以使用正则表达式去进行一个提取啊,其实我们会发现就是正则表达式它更多的时候是处理一件什么事事情呢?就是对我们想要的那个字符,或者说某些文本做一个模糊式的匹配搜索。什么意思呢?就是比方说,哎,我们要找的有可能不是固定的某个关键字,就叫做K啊,就就叫做艾特硅谷,或者就叫做Linux,不是说往往都是这样去搜索的,往往我们要的是比方说。某一个IP地址以什么开头啊?以192.168这样开头的所有的IP地址,我要把它都筛选出来,这就是一种匹配方式。那另外还有就是比方说一个用户名,我就指定它里边必须要包含ABC这样的一个子串,只要用户名里面包含这个就可以,哎,这也是一个需求,所以实际的应用往往是这样一些模糊匹配的一些规则,哎,这就需要我们专门为这个规则制定一个匹配的模式,诶这个在英文里边一般把它叫做pattern。
02:16
就相当于我们要定义这样的一个模式,然后按照它制定规则去匹配相应的文本字符串,呃,那所谓的正则呢,其实就是好,就是用来定义这样一个匹配规则,匹配模式的一个工具啊,那所以正则表达式我们这里有一个定义啊,就是它可以使用单个的字符串来描述匹配一系列符符合某个语法规则的字符串啊,这个听起来比较绕口,其实简单来讲就是说它可以灵活的,非常灵活的给我们定义各种各样的模糊匹配筛选规则。啊,所以在很多这个文本编辑器里边啊,它都是支持正则的啊,就是用正则表达式可以用来检索替换那些符合某种规则,某个模式的文本。
03:06
啊,那除了文本编辑器呢,我们知道在Linux当中还有很多各种各样用来做文本处理的工具,比如说之前我们非常熟悉的grape啊,那还有一个非常有名的SC啊,那另外还有aw这些都是非常有名的啊,也是非常功能强大的文本处理工具啊,那对于他们来讲。都是支持正则表达式,他们都可以通过正则表达式来进行模式的匹配,然后进行筛选,过滤,切片、分析,处理各种各样的操作啊,这就是正则表达式可以说是非常非常的强大啊,所以说本来正则表达式的内容是非常多的,很复杂啊,那所以我们的时间有限,这里呢,只是做一个正则表达式的入门介绍,哎,方便我们后边在link shell编程过程当中啊,使用一些文本处理工具。啊,那首先我们先来做一个常规匹配的介绍,就是最简单的正则是什么呢?其实非常简单,之前我们使用grape进行文本过滤筛选的时候,其实就已经用到了。
04:12
就是我们直接给出一个关键字。不含任何的特殊字符,它其实就是一个最常规最基本的正则表达式,它只匹配它自己,这就是一个纯文本的匹配啊,这里我们可以举这个例子啊,呃,去筛选当前的艾特硅谷用户,诶,我们知道当前我们可以在。ETC password。这个文件里边可以获取到当前所有的用户信息,那我们直接这么一开的话,里面东西太多了,往往就要进行一个筛选,诶这个时候我们可以用一个管道操作,把得到的内容交给grape去进行过滤,那grape的时候呢,后边跟着的就是我们要过滤的关键字,比方说这里我们给一个at硅谷,诶,那当然直接就筛选出来艾特硅谷这个用户相关的内容了。
05:01
啊,其实我们也知道啊,只要你想要做某个关键字的筛选。可以是某个用户的名称,也可以是中间的某个字段,哎,比方说我现在就想去grape一下1000,然后加冒号,诶,这也是可以的,只要有1000加冒号就可以把它筛选出来啊,比方说我想筛选这个零零加冒号,这也是可以的,哎,所以所以你看这个100冒号和1000冒号都可以做匹配筛选。这就是纯文本的筛选啊,直接匹配自己,这是最基本的用法,常规匹配,那除了他之外呢?诶,在正则表达式里边,它的精髓或者说强大的地方是在于它可以用各种各样的特殊字符去进行我们所说的模糊匹配。接下来我们就一一进行介绍,我们先看一下啊,就是常用的特殊字符到底有哪些。首先是一个上间号。啊,上间号呢,它匹配的是一行的开头。
06:00
哎,什么意思呢?在正则里边使用的时候,就是上间号作为正则的开始,后边可以跟着某一个字符或者某一组字符,它就表示,比方说上加号A,就表示以A开头的所有行。啊,接下来我们可以在控制台里边直接输一下这句话啊,去看一下,诶,我们还是直接看EDC password,然后grape这里边我们跟上一个正则,一个上千号,然后带A,我们可以看到当前拿到的就全部都是以A开头的,行啊,那除了艾特硅谷这个用户之外,还有这个,呃,A dmin啊,还有about啊,啊,还有其他的这些以A开头的用户,这些我们就都看到了。那当然了,不光是可以只以A开头,比方说我也可以以at开头,哎,那这个时候就只剩下艾特硅谷了。除了使用上间号去匹配一行的开头,那当然了,有开头就有结尾吗?啊,那另外一个特殊字符就是我们非常熟悉的Dollar Dollar符,呃,其实我们知道除了在脚本里边我们可以表示某一个变量啊,前面加一个Dollar符,或者表示这个命令替换的时候加Dollar符,那它还可以表示一行的结束,哎,那所以这里边如果我们直接去使用Dollar符的话,注意啊,它匹配一行的结束,所以Dollar符应该是放在最后边。
07:24
前边是对应的这个匹配的字符啊,就是一行结束的那个字符,比方说诶,我们这里看到艾特硅谷,它最后这是我们登录的控制台啊,对应的这个控制台嘛,是bash,那所以这里面我筛选以bash作为结尾的,作为当前这个登录控制台的所有的用户。诶,我们可以看到现在就不止艾特硅谷一个了啊,那root当然它也是冰啊,用控制台登录的,那还有我们注册的其他的用户,也是Tony David的,小明小亮之前所用过的所有用户现在就都出来了。其实如果我们仔细回忆的话,就会记得啊,前面我们介绍为操作的时候。
08:02
在W里边有一些快捷方式,哎,Ta在这个V的普通模式下,怎么样能够快速的跳转到一行的开头和结尾呢?诶,其实我们当时按的快捷键就是上间号和Dollar,哎,所以这个我们看到啊,文本编辑器里边其实跟这个正则的规则定义是完全一样的,使用这个就可以表示当前的开头和结尾。那当然了,这里我们就会又有另外一个疑问,就是说诶,那这个开头和结尾是不是可以一起使用呢?诶当然是可以一起使用,假如说这个时候啊,我们直接。给一个上间号开头,然后at开头,后边bash结尾,诶,那这个能不能匹配到东西呢?很显然它是匹配不到东西的,因为我们这就要求这一行就写死了,只能叫at bash。啊,那当然我们就没有对应的匹配了,你如果要是前面上千号和Dollar之间全是指定字符的话,你就必须把这一行完整的全匹配到才能够输出啊,那这里还有另外一个问题,我们看啊,这里提出了,如果中间什么东西都没有,就一个上间号和一个Dollar,这能匹配什么呢?
09:13
哎,其实我们能想到啊,这不就是相当于中间什么字符都没有匹配的,就应该是空行嘛啊,那所以当前我们这个password里面当然是没有空行的啊啊,那之前我们可以找一下我们某一个这个脚本文件,比如说我们直接看一下当前啊,就是这个daily阿IVe.SH啊,直接把它做一个筛选GR当前的。头和尾都什么东西都没有,哎,然后直接去截取,我们看匹配到的就全部都是空行,诶那是看这看起来没有任何意义啊,啊没关系,我们可以GR的时候加一个杠N参数显示当前的行号,诶那这下我们就看到了,到底哪些行是空行呢?诶我们当时空了这么多行啊,所以就可以看到当前的这个空行所在的位置。
10:04
这是个关于一行的开头和结尾的匹配,那除了匹配开头和结尾,还可以用其他的一些特殊字符来匹配某一个中间的字符,哎,比如说这里边我们可以看到,哎,那我们想到某一个中间字符,那你要匹配什么就是什么嘛,你要匹配A那就写一个A,要匹配B就写一个B嘛,这有什么好说的呢?哎,我们看到在正则里边是有所谓的通配符的。哎,什么叫通配符呢?就是匹配任意的字符,什么都行,比方说这里一个点就表示可以匹配一个任意的字符,这里所说的字符就是呃,字母,数字,特殊符号,什么东西都可以啊,在这里直接就可以匹配上,比如说我们这里来一个R点点T。啊,那我们在这里可以书写一下这个。R点点T,这表示什么呢?就可以筛选出所有的R和T中间有两个字母的行包含了这样。
11:03
字符串的这样的行,那我们看到root就符合这样一个标准吧,所以我们就截取到了这样一行啊,那对应的我们还是看之前的password这里啊,这里可能看的更加的明确一点,数据会更多诶,那我们一看的话,所有的root不光是root,包括这里的我们看Y-FTP,它中间因为是一斜杠和一个F,这也是两个字符啊,所以它也同样匹配出来了。哎,这就是这样的一个用法,那如果说我们这里是点T的话,那这里匹配的就相当于是只能中间隔一个字符,哎,那你看rat这就匹配出来了。那同样我们就想到了,你如果要是更多字符的话,那点点点点点,那就那就是R和T中间必须要有三个字符,不管是什么,有三个字符就可以匹配出来。这是对于这个字符个数的一个精确的定义啊,那我们自然就想到了,那假如说我并不是就是说把这个字符精确的定义住啊,我有可能就是某一个字符,它有可能重复出现好多次。
12:03
重复匹配能不能这么做呢?哎,也是可以的,我们这里还有另外一个特殊字符叫做星号,哎星号之前我们也经常见过啊,好些地方都用它当做一个通配符啊,那这个时候其实这个通配啊,它并不是说表示任意的一个字符,它是表示某一个字符出现任意次啊,所以它一般不是单独使用的,它是要跟上一个字符连在一起使用。比如说我们这里如果是O后面来一个芯的话,就表示这个O会出现任意多次,注意这里的任意多次就是零次、一次或多次,随便多少次都可以。所以我们看一下当前如果用到这个芯号的话。O然后芯儿。那么我们看它其实就会匹配到。O不出现也可以,RT也可以啊,那如果要有这个rot的话,那那也可以对吧,就是直接就是三个字母rot也能匹配到,那或者这个ROOT2个也能匹配到,如果还有rot的话,当然也可以匹配到,哎,这就是这个星号的主要的用法。
13:13
哎,那我们自然就想到了另外一个问题啊,既然看着这个点,它是匹配任意单个字符,心是指前面一个字符出现任意多次,那假如我们把这两个做一个结合点心又能匹配什么东西呢?哎,那它表示的就是任意一个字符,然后出现任意次,那所以我们就想到了任意字符出现任意次,这不就是一个任意的字符串嘛,啊,随便给一个字符串什么都能匹配,甚至它还可以匹配空字符串,对吧?因为前面这个点是任意字符,但是后面这个芯儿表示它可以出现零次啊,哎,所以它连空字符串都能匹配到。那这样一个东西它有什么用呢?诶,我们可以直接来考虑这样一个问题,就像前面啊,我们不是说过,诶,假如说我们指定了开头,然后又指定了结尾,但是呢,中间你就必须严格意义上匹配吗?哎,那假如我现在就是。
14:08
想要找到,比方说以A打头。然后前面我们不是有BA吗?以BA结尾的。所有的行,诶,那这个中间可以怎么表示呢?哎,现在我们就有招了,中间我不知道是什么,没关系,可以做一个模糊匹配,任意字符出现任意多次。甚至你中间什么都不出现也可以,直接就是ABA也可以,哎,那所以这样的一个匹配就可以符合我们的要求,所以接下来我们可以把这个做一个实现,那就是一个上间号,然后A后边是点心,然后BA。这就表示指定了当前要筛选的开头是A,结尾是bash,中间是任意的啊,那我们看到符合这个标准的只有at硅谷这一行啊,啊,那当然这是因为前面这个以A打头的,别的都最后的这个登录的控制台都不是BA,那所以呢,我们把这个如果改成当时那个好像是log in对吧,我们改成in结尾。
15:09
现在看到诶,另外的三个就都被筛选出来了,所以这就是我们所说的这个开头结尾是可以用这种方式去指定。当然了,另外我们也可以把中间的某个字段也指定,比方说还可以怎么样呢,就在这个基础上啊,以A开头,以in,以in结尾,中间呢,哎,我可以出现一个Y。那如果要出现一个Y,那就是A和Y中间可以出现任意的字符串,然后Y和后边的in之间也可以出现任意的字符串,哎,这样的话,我一筛选,我们可以看到剩下两个了,因为这中间有Y,这里中间也有Y,哎,所以我们得到的就是这样的匹配出来的好。呃,所以这个灵活使用的话啊,正则可以匹配可以说我们任意的需求。
我来说两句