📄 0330regularex.htm
字号:
<span class="text_import2">简单的说,正规表示法就是处理字串的方法,他是以行为单位,
来进行字串的处理行为,他透过一些特殊符号的辅助,可以让使用者轻易的达到 搜寻/取代
某特定字串的处理程序!</span><br><br>
举例来说,我要找到 VBird 或 Vbird 这个字样,但是不要其他的字串,该如何办理?
如果在没有正规表示法的环境中(例如 MS word),您或许就得要使用忽略大小写的办法,
或者是分别以 VBird 及 Vbird 搜寻两遍。但是,忽略大小写可能会搜寻到 VBIRD/vbird/VbIrD
等等的不需要的字串,而造成使用者的困扰。<br><br>
再举个系统常见的例子好了,假设你发现系统在开机的时候,老是会出现一个关于 mail 程式的错误,
而开机过程的相关程序都是在 /etc/rc.d/ 底下,也就是说,在该目录底下的某个档案内具有 mail
这个关键字,好了,此时,您怎么找出来含有这个关键字的档案??您当然可以一个档案一个档案的开启,
然后去搜寻 mail 这个关键字,只是.....该目录底下的档案可能不止 100 个说~
如果了解正规表示法的相关技巧,那么只要一行指令就找出来啦! 『grep 'mail' /etc/rc.d/*』
那个 grep 就是支援正规表示法的工具程式之一!如何~很简单吧! ^_^y<br><br>
谈到这里就得要进一步说明了,正规表示法基本上是一种『表示法』,
只要工具程式支援这种表示法,那么该工具程式就可以用来作为正规表示法的字串处理之用。
也就是说,例如 vi, grep, awk ,sed 等等工具,因为她们有支援正规表示法,
所以,这些工具就可以使用正规表示法的特殊字元来进行字串的处理。
</div>
<hr><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">正规表示法对于系统管理员的用途</span><br>
<div class="block2">
那么为何我需要学习正规表示法呢?对于一般使用者来说,由于使用到正规表示法的机会可能不怎么多,
因此感受不到他的魅力,不过,对于身为系统管理员的您来说,
<span class="text_import2">正规表示法则是一个『不可不学的好东西!</span>』
怎么说呢?由于系统如果在繁忙的情况之下,每天产生的讯息资讯会多到你无法想像的地步,
而我们也都知道,系统的『<a href="0570syslog.php">错误讯息登录档案</a>』
的内容(这部份我们在第五篇会详谈)记载了系统产生的所有讯息,当然,
这包含你的系统是否被『入侵』的纪录资料。<br><br>
但是系统的资料量太大了,要身为系统管理员的你每天去看这么多的讯息资料,
从千百行的资料里面找出一行有问题的讯息,呵呵~光是用肉眼去看,想不疯掉都很难!
这个时候,我们就可以透过『正规表示法』的功能,将这些登录的资讯进行处理,
仅取出『有问题』的资讯来进行分析,哈哈!如此一来,你的系统管理工作将会
『快乐得不得了』啊!当然,正规表示法的优点还不止于此,等您有一定程度的了解之后,您会爱上他喔!
</div>
<hr><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">正规表示法的广泛用途</span><br>
<div class="block2">
正规表示法除了可以让系统管理员管理主机更为便利之外,事实上,
由于正规表示法强大的字串处理能力,目前一堆软体都支援正规表示法呢!
最常见的就是『邮件伺服器』啦!<br><br>
如果您留意网际网路上的消息,那么应该不能发现,目前造成网路大塞车的主因之一就是『垃圾/广告信件』了,
而如果我们可以在主机端,就将这些问题邮件剔除的话,用户端就会减少很多不必要的频宽耗损了。
那么如何剔除广告信件呢?由于广告信件几乎都有一定的标题或者是内容,因此,
只要每次有来信时,都先将来信的标题与内容进行特殊字串的比对,发现有不良信件就予以剔除!
嘿!这个工作怎么达到啊?就使用正规表示法啊!目前两大邮件伺服器软体 sendmail 与 postfix
以及支援邮件伺服器的相关分析套件,都支援正规表示法的比对功能!<br><br>
当然还不止于此啦,很多的伺服器软体、以及套件都支援正规表示法呢!当然,
虽然各家软体都支援他,不过,这些『字串』的比对还是需要系统管理员来加入比对规则的,
所以啦!身为系统管理员的你,为了自身的工作以及用户端的需求,
正规表示法实在是很需要也很值得学习的一项工具呢!
</div>
<hr><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">正规表示法与 Shell 在 Linux 当中的角色定位</span><br>
<div class="block2">
说实在的,我们在学数学的时候,一个很重要、但是粉难的东西是一定要『背』的,
那就是九九乘法表,背成功了之后,未来在数学应用的路途上,真是一帆风顺啊!
这个九九乘法表我们在小学的时候几乎背了一整年才背下来,并不是这么好背的呢!
但他却是基础当中的基础!您现在一定受惠相当的多呢 ^_^!
而我们谈到的这个正规表示法,与前一章的 <a href="0320bash.php">BASH shell</a>
就有点像是数学的九九乘法表一样,是 Linux 基础当中的基础,虽然也是最难的部分,
不过,如果学成了之后,一定是『大大的有帮助』的!这就好像是金庸小说里面的学武难关,
任督二脉,打通任督二脉之后,武功立刻成倍成长!所以啦,
不论是对于系统的认识与系统的管理部分,他都有很棒的辅助啊!请好好的学习这个基础吧! ^_^
</div>
<hr><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">延伸的正规表示法</span><br>
<div class="block2">
正规表示法除了简单的一组字串处理之外,还可以作群组的字串处理,
例如进行搜寻 VBird 或 netman 或 lman 的搜寻,注意,是『或(or)』而不是『和(and)』的处理,
此时就需要延伸正规表示法的帮助啦!藉由特殊的 ( 与 | 等字元的协助,
就能够达到这样的目的!好啦!清清脑门,咱们用功去棉!
</div>
<div style="padding: 10 0 10 0 ;" align="right"><table width="90%"><tr><td><b>Tips:</b><br /><span style="font-style: italic; color : darkgreen"> 有一点要向大家报告的,那就是∶『<b>正规表示法与万用字元是不一样的东西!</b>』
这很重要喔!因为万用字元 (wildcard) 所代表的意义与正规表示法并不相同~
要分的很清楚才行喔!所以,学习本章,请将前一章 bash 的万用字元意义先忘掉吧!
</span></td><td><img src="../images/vbird_face.gif" /></td></tr></table></div></div>
<hr><a NAME="basic_regexp"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">基础正规表示法</span><br>
<div class=block1>
既然正规表示法是处理字串的一个标准表示方式,他需要支援的工具程式来辅助,
所以,我们这里就先介绍一个最简单的字串撷取功能的工具程式,那就是 grep 棉!
在介绍完 grep 的基本功能之后,就进入正规表示法的特殊字符的处理能力了。<br><br>
<hr><a name="grep"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">以 grep 撷取字串</span><br>
<div class="block2">
既然要使用 grep 当然就得要先了解一下 grep 的语法棉~<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep [-acinv] '搜寻字串' filename</span>
<span class="term_say">参数说明∶</span>
<span class="term_say">-a ∶将 binary 档案以 text 档案的方式搜寻资料
-c ∶计算找到 '搜寻字串' 的次数
-i ∶忽略大小写的不同,所以大小写视为相同
-n ∶顺便输出行号
-v ∶反向选择,亦即显示出没有 '搜寻字串' 内容的那一行!</span>
<span class="term_say">范例∶</span>
[root@test root]# <span class="term_command">grep 'root' /var/log/secure</span>
<span class="term_say">将 /var/log/secure 这个档案中有 root 的那一行秀出来</span>
[root@test root]# <span class="term_command">grep -v 'root' /var/log/secure</span>
<span class="term_say">若该行没有 root 才将资料秀出来到萤幕上!</span>
[root@test root]# <span class="term_command">last | grep root</span>
<span class="term_say">若该行有 root 才将资料秀出来到萤幕上!</span>
</pre></td></tr></table>
grep 是一个很常见也很常用的指令,他最重要的功能就是进行字串资料的比对,
然后将符合使用者需求的字串列印出来。
需要说明的是『<span class="text_import2">grep 在资料中查寻一个字串时,是以 "整行"
为单位来进行资料的撷取的!</span>』也就是说,假如一个档案内有 10
行,其中有两行具有你所搜寻的字串,则将那两行显示在萤幕上,其他的就丢弃了!<br><br>
而 grep 除了可以进行档案的资料搜寻之外,也常常被应用在 input/output
的资料处理当中,例如常见的 <a href="0320bash.php#pipe">管线命令 ( pipe )</a> 就可以常常见到他的踪影!
以上面表格中的例子来看,我们可以发现前两个例子是查寻档案的内容,有没有加上 -v
所显示出来的结果是『相反的!』,而第三个例子则是以 pipe 的功能进行资料的处理的喔!<br><br>
好了,我们就开始以 grep 来进行正规表示法的简易说明吧!我们先以底下这个档案来作为范例∶<br>
<table class="term"><tr><td class="term">
[root@test root]# <span class="term_command">vi regular_express.txt</span><br>
"Open Source" is a good mechanism to develop programs.<br>
apple is my favorite food.<br>
Football game is not use feet only.<br>
this dress doesn't fit me.<br>
However, this dress is about $ 3183 dollars.
<br>
GNU is free air not free beer.
<br>
Her hair is very beauty.
<br>
I can’t finish the test.
<br>
Oh! The soup taste good.
<br>
motorcycle is cheap than car.<br>
This window is clear.<br>
the symbol '*' is represented as start.<br>
Oh! My god!<br>
The gd software is a library for drafting programs.
<br>
You are the best is mean you are the no. 1.<br>
The world <Happy> is the same with "glad".<br>
I like dog.<br>
google is the best tools for search keyword.<br>
goooooogle yes!<br>
go! go! Let's go.<br>
# I am VBird<br>
<br>
</td></tr></table>
需要特别注意的是,上面这个档案鸟哥是在 Windows 的环境下编辑的,
并且经过特殊处理过,因此,他虽然是纯文字档,但是内含一些 Windows
环境下的软体常常自行加入的一些特殊字元,例如断行字元(^M)就是一例!
所以,您可以直接将上面的文字以 vi 储存成 regular_express.txt 这个档案,
不过,比较建议直接点底下的连结下载∶<ul>
<a href="0330regularex/regular_express.txt">http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt</a></ul>
此外,因为不同的语系编码是不一样的,所以,您必须要将语系改成英文语系,
才能够进行底下的测试,否则,可能会有显示的内容与底下的输出不符的状况喔!
修改语系的方法为∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">LANG=en</span>
[root@test root]# <span class="term_command">export LANG</span>
</pre></td></tr></table>
好了,现在开始我们一个案例一个案例的来介绍吧!<br>
<ul>
<li><span class="text_import1">例题一、搜寻特定字串∶</span><br>
搜寻特定字串很简单吧?假设我们要从刚刚的档案当中取得 the 这个特定字串,
最简单的方式就是这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'the' regular_express.txt</span>
8:I can't finish <span class=term_note_b>the</span> test.
12:<span class=term_note_b>the</span> symbol '*' is represented as start.
15:You are <span class=term_note_b>the</span> best is mean you are the no. 1.
16:The world <Happy> is <span class=term_note_b>the</span> same with "glad".
18:google is <span class=term_note_b>the</span> best tools for search keyword.
</pre></td></tr></table>
那如果想要『<span class="text_import2">反向选择</span>』呢?也就是说,当该行没有
'the' 这个字串时,才显示在萤幕上,那就直接使用∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -vn 'the' regular_express.txt</span>
</pre></td></tr></table>
您会发现,萤幕上出现的行列为除了 8,12,15,16,18 五行之外的其他行列!
接下来,如果您想要取得不论大小写的 the 这个字串,则∶<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -