11.1 开始之前:什么是正则表达式

约略了解了 Linux 的基本指令 (BASH) 并且熟悉了 vim 之后,相信你对于敲击键盘的打字与指令下达比较不陌生了吧? 接下来,下面要开始介绍一个很重要的观念,那就是所谓的“正则表达式 (Regular Expression)”啰!

  • 什么是正则表达式

任何一个有经验的系统管理员,都会告诉你:“正则表达式真是挺重要的!” 为什么很重要呢?因为日常生活就使用的到啊!举个例子来说, 在你日常使用 vim 作文书处理或程序撰写时使用到的“搜寻/取代”等等的功能, 这些举动要作的漂亮,就得要配合正则表达式来处理啰!

简单的说,正则表达式就是处理字串的方法,他是以行为单位来进行字串的处理行为, 正则表达式通过一些特殊符号的辅助,可以让使用者轻易的达到“搜寻/删除/取代”某特定字串的处理程序!

举例来说,我只想找到 VBird(前面两个大写字符) 或 Vbird(仅有一个大写字符) 这个字样,但是不要其他的字串 (例如 VBIRD, vbird 等不需要),该如何办理?如果在没有正则表达式的环境中(例如 MS word),你或许就得要使用忽略大小写的办法, 或者是分别以 VBird 及 Vbird 搜寻两遍。但是,忽略大小写可能会搜寻到 VBIRD/vbird/VbIrD 等等的不需要的字串而造成困扰。

再举个系统常见的例子好了,假设你发现系统在开机的时候,老是会出现一个关于 mail 程序的错误, 而开机过程的相关程序都是在 /lib/systemd/system/ 下面,也就是说,在该目录下面的某个文件内具有 mail 这个关键字,你想要将该文件捉出来进行查询修改的动作。此时你怎么找出来含有这个关键字的文件? 你当然可以一个文件一个文件的打开,然后去搜寻 mail 这个关键字,只是.....该目录下面的文件可能不止 100 个说~ 如果了解正则表达式的相关技巧,那么只要一行指令就找出来啦:“grep 'mail' /lib/systemd/system/*” 那个 grep 就是支持正则表达式的工具程序之一!如何~很简单吧!

谈到这里就得要进一步说明了,正则表达式基本上是一种“表达式”, 只要工具程序支持这种表达式,那么该工具程序就可以用来作为正则表达式的字串处理之用。 例如 vi, grep, awk ,sed 等等工具,因为她们有支持正则表达式, 所以,这些工具就可以使用正则表达式的特殊字符来进行字串的处理。但例如 cp, ls 等指令并未支持正则表达式, 所以就只能使用 bash 自己本身的万用字符而已。

  • 正则表达式对于系统管理员的用途

那么为何我需要学习正则表达式呢?对于一般使用者来说,由于使用到正则表达式的机会可能不怎么多, 因此感受不到他的魅力,不过,对于身为系统管理员的你来说,正则表达式则是一个“不可不学的好东西!” 怎么说呢?由于系统如果在繁忙的情况之下,每天产生的讯息信息会多到你无法想像的地步, 而我们也都知道,系统的“错误讯息登录文件 (第十八章)” 的内容记载了系统产生的所有讯息,当然,这包含你的系统是否被“入侵”的记录数据。

但是系统的数据量太大了,要身为系统管理员的你每天去看这么多的讯息数据, 从千百行的数据里面找出一行有问题的讯息,呵呵~光是用肉眼去看,想不疯掉都很难! 这个时候,我们就可以通过“正则表达式”的功能,将这些登录的信息进行处理, 仅取出“有问题”的信息来进行分析,哈哈!如此一来,你的系统管理工作将会 “快乐得不得了”啊!当然,正则表达式的优点还不止于此,等你有一定程度的了解之后,你会爱上他喔!

  • 正则表达式的广泛用途

正则表达式除了可以让系统管理员管理主机更为便利之外,事实上,由于正则表达式强大的字串处理能力, 目前一堆软件都支持正则表达式呢!最常见的就是“邮件服务器”啦!

如果你留意网际网络上的消息,那么应该不难发现,目前造成网络大塞车的主因之一就是“垃圾/广告信件”了, 而如果我们可以在服务器端,就将这些问题邮件剔除的话,用户端就会减少很多不必要的带宽耗损了。 那么如何剔除广告信件呢?由于广告信件几乎都有一定的标题或者是内容,因此, 只要每次有来信时,都先将来信的标题与内容进行特殊字串的比对,发现有不良信件就予以剔除! 嘿!这个工作怎么达到啊?就使用正则表达式啊!目前两大邮件服务器软件 sendmail 与 postfix 以及支持邮件服务器的相关分析软件,都支持正则表达式的比对功能!

当然还不止于此啦,很多的服务器软件都支持正则表达式呢!当然, 虽然各家软件都支持他,不过,这些“字串”的比对还是需要系统管理员来加入比对规则的, 所以啦!身为系统管理员的你,为了自身的工作以及用户端的需求, 正则表达式实在是很需要也很值得学习的一项工具呢!

  • 正则表达式与 Shell 在 Linux 当中的角色定位

说实在的,我们在学数学的时候,一个很重要、但是粉难的东西是一定要“背”的, 那就是九九乘法表,背成功了之后,未来在数学应用的路途上,真是一帆风顺啊! 这个九九乘法表我们在小学的时候几乎背了一整年才背下来,并不是这么好背的呢! 但他却是基础当中的基础!你现在一定受惠相当的多呢 ^_^!

而我们谈到的这个正则表达式,与前一章的 BASH 就有点像是数学的九九乘法表一样,是 Linux 基础当中的基础,虽然也是最难的部分, 不过,如果学成了之后,一定是“大大的有帮助”的!这就好像是金庸小说里面的学武难关:任督二脉! 打通任督二脉之后,武功立刻成倍成长!所以啦, 不论是对于系统的认识与系统的管理部分,他都有很棒的辅助啊!请好好的学习这个基础吧! ^_^

  • 延伸的正则表达式

唔!正则表达式还有分喔?没错喔!正则表达式的字串表示方式依照不同的严谨度而分为: 基础正则表达式与延伸正则表达式。延伸型正则表达式除了简单的一组字串处理之外,还可以作群组的字串处理, 例如进行搜寻 VBird 或 netman 或 lman 的搜寻,注意,是“或(or)”而不是“和(and)”的处理, 此时就需要延伸正则表达式的帮助啦!借由特殊的“ ( ”与“ | ”等字符的协助, 就能够达到这样的目的!不过,我们在这里主力仅是介绍最基础的基础正则表达式而已啦!好啦!清清脑门,咱们用功去啰!

鸟哥的图示

Tips 有一点要向大家报告的,那就是:“正则表达式与万用字符是完全不一样的东西!” 这很重要喔!因为“万用字符 (wildcard) 代表的是 bash 操作接口的一个功能”,但正则表达式则是一种字串处理的表示方式! 这两者要分的很清楚才行喔!所以,学习本章,请将前一章 bash 的万用字符意义先忘掉吧!

老实说,鸟哥以前刚接触正则表达式时,老想着要将这两者归纳在一起,结果就是...错误认知一大堆~ 所以才会建议您学习本章先忘记万用字符再来学习吧!