📄 0330regularex.htm
字号:
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head> <meta http-equiv="Content-Type" content="text/html; "> <meta name="Author" content="VBird"> <meta name="GENERATOR" content="Mozilla/4.5 [zh-TW] (WinNT; I) [Netscape]"> <title>鸟哥的 Linux 私房菜 -- 正规表示法</title><!-- saved from url=(0022)http://internet.e-mail --><style> <!-- body{background-image=url(http://linux.vbird.org/VBirdLinux.jpg);background-ATTACHMENT=FIXED} --></style></head><body nosave="" background="0330regularex_files/VBirdLinux.jpg"><center><center><b><font size="+2" color="#3333ff"><font face="SimSun">鸟哥的</font><font face="Times New Roman,Times"> Linux </font><font face="SimSun">与</font><font face="Times New Roman,Times"> ADSL </font><font face="SimSun">私房菜</font></font></b><br><a href="http://linux.vbird.org/" target="_top"><img src="0330regularex_files/VBirdTitle2.jpg" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_basic"><img src="0330regularex_files/icon_system.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_server"><img src="0330regularex_files/icon_server.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_security"><img src="0330regularex_files/icon_security.jpg" nosave="" border="0" height="25" width="90"></a><a href="http://phorum.vbird.org/" target="_blank"><img src="0330regularex_files/icon_forums.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/adsl"><img src="0330regularex_files/icon_adsl.gif" nosave="" border="0" height="25" width="90"></a><br><hr width="100%"></center><font size="+2" color="#3333ff"><a href="http://linux.vbird.org//linux_basic/0330regularex.php" target="_self"><font face="SimSun">正规表示法(</font>RegularExpression,RE<font face="SimSun">)(积极施工中)</font></a></font></center><div align="right"><font size="-1" color="#3333ff" face="SimSun">最近更新日期:2003/03/15</font></div><font size="-2" color="#000099"> </font><table bgcolor="#ffcccc" border="1" cols="1" width="100%"><tbody><tr><td><font size="-1" color="#000099">正规表示法或者称为常规表示法等等,在Unix Like 的机器当中,实在是一个相当重要的系统管理员的『利器』!此外,很多的套件也都使用正规表示法的语法在进行工作的分析用途!正规表示法最常用在字符串的搜寻与比对,他可以用来进行相当多样化的比对技巧,可以帮助套件取得所需要的资料,例如邮件服务器sendmail 与 postfix 等,都有使用到正规表示法的方式在进行邮件的过滤工作呢!另外,正规表示法也可以帮助使用者快速取得所需要的资料,并且可以协助使用者快速的以取得的数据进行取代的动作等,鸟哥使用这个比对的技巧设计了许多管理的小程序来管理我的Linux ,实在是相当的有用啊!注:本章节使用者需要多加练习,因为目前很多的套件都是使用正规表示法来达成其『过滤、分析』的目的,为了未来主机管理的便利性,使用者至少要能看的懂正规表示法的意义!</font></td></tr></tbody></table><font size="-2" color="#000099"> </font><br><font size="+1" color="#000099"><a href="#before">前言</a>:</font><br><font size="+1" color="#000099"><a href="#basic_regexp">基础正规表示法</a></font>:<br> :grep 应用简介<br> :重要特殊字符(characters)<br><font size="+1" color="#000099">延伸正规表示法</font>:<br> :延伸正规表示法的特殊字符<br> :egrep 应用简介<br>在线文书编辑器 ed 简介<br>常用的相关字符指令:<br> :tr<br> :col<br> :expand, unexpand<br> :paste, ...<br>好用的搜寻软件 sed 简介<br>厉害的 awk 简介<br>正规表示法与管线命令之应用<br>相关应用:<br> :档案的比对 diff, cmp, ....<br><font size="+1" color="#000099"><a href="#important">重点回顾</a></font><br><font size="+1" color="#000099"><a href="#lpi">本章与 LPI 的关系</a></font><br><font size="+1" color="#000099"><a href="#reference">参考资源</a>:</font><br><font size="+1" color="#000099"><a href="#FAQ">本章习题练习</a></font><br><hr width="100%"><a name="before"></a><font size="+1" color="#000099">前言:</font><ul>约略了解了 Linux 的基本指令 ( <a href="http://linux.vbird.org//linux_basic/0320bash.php">Shell</a> ) 并且熟悉了<a href="http://linux.vbird.org//linux_basic/0310vi.php">vi</a> 之后,接下来,我们要介绍如何在文字模式底下( <a href="http://linux.vbird.org//linux_basic/0320bash.php">Shell</a> 环境当中 ) 进行数据的撷取,以获得使用者所需要的重要讯息。这个功能很重要,怎么说呢?在您的计算机工作平台中,或多或少都会使用到『搜寻』以及『取代』的功能对吧!例如使用<a href="http://www.google.com/" target="_blank">Google</a> 或者 <a href="http://www.openfind.com.tw/" target="_blank">Openfind</a>去寻找网页信息、例如以文书编辑软件编辑的过程中,发现错误,而使用取代的方式来取代掉错误字眼,又例如你开启的一篇文件数据当中,由于数据量太大,所以直接以搜寻的方法去找出你所需要的关键内容等等,这些都是使用到搜寻与取代的功能喔!不过,在您惯用的操作系统当中,平常的工作下(非服务器环境) 大概无法进行底下的功能吧:『如何<font color="#000066">在一串字符串当中,寻找有abc 以及 tqm 还有 WWW 的关键词!</font>』,哇!一口气要达到三组以上的关键词搜寻,大概平常的作法就是搜寻三遍吧!不过,如此一来,却又太浪费时间,并且搜寻完毕后还要将搜寻的数据结合,真麻烦!那有没有其它的方式可以达到这个目的呢?有的,那就是使用『正规表示法』来进行搜寻啰!<br> <li><b><font color="#000099">什么是正规表示法:</font></b></li><br>什么是正规表示式 ( Regular Expression, 底下简称 RE ) 呢?简单的说,在Linux 的环境下,我们可以透过『<font color="#000066">字符串以及一些特殊字符的辅助</font>』来进行文字的比对工作,好来让使用者筛选自己所需要数据。<font color="#000066">这些特殊的字符与搭配使用的工具,就构成了正规表示法的主轴啦</font>!举个简单的例子来说,我要找到VBird 或 Vbird 这个字样,但是不要其它的字符串,如果使用大小写都接受的情况,我就有可能会找到VBIRD 或 vbird 或 vbIRd 等等的字眼,但是我却只要前两个字符串而已啊!这个时候,我可以使用 <font color="#000066" face="SimSun">V[Bb]ird</font>来搜寻呢!呵呵!那个中括号[]就是一个很常见的表示法之一啰!此外,正规表示法搜寻的结果显示当中,由于RE 主要针对『一行』来进行处理,如果是在文书排版的软件当中,则是以『一整段(没有断行)』来进行处理,如果该行有所需要的数据时,则取出来进行处理,如果该行无搜寻的数据,则将该行舍弃,不进行处理与显示!<br> <br>再举个常见的例子好了,在一堆档案当中,例如 /etc/rc.d/init.d 这个目录当中好了,如果你要找到一个档案内容含有mail 这个字符串的文件名,要怎么搜寻呢?利用 grep 配合 mail 以及万用字符来搜寻所有的文件名『<font color="#000066" face="SimSun">grep'mail' /etc/rc.d/init.d/*</font>』,赫赫!马上就可以找到你想要的档案数据啦!这样可以用来进行很快速的比对呢!对于使用纯文字文件编辑文件的人来说,真是一个好消息啊!最起码,不用像MS word 一样,总是需要一个档案一个档案的开启啊! ^_^!说的好似很复杂,其实不怎么难的,底下我们会有很多例子让大家来实作,您就会晓得啦!<br> <li><b><font color="#000099">正规表示法对于系统管理员的用途:</font></b></li><br>那么为何我需要学习正规表示法呢?对于一般使用者来说,由于使用到正规表示法的机会不怎么多,因此感受不到他的魅力,不过,对于身为系统管理员的您来说,<font color="#000066">正规表示法则是一个『不可不学的好东西!</font>』怎么说呢?由于系统如果在繁忙的情况之下,每天产生的讯息信息会多到你无法想象的地步,而我们也都知道,系统的『<a href="http://linux.vbird.org//linux_basic/0570syslog.php">错误讯息登录档案</a>』的内容(这部份我们在第五篇会详谈)记载了系统产生的所有讯息,当然,这包含你的系统是否被『入侵』的纪录数据。但是系统的数据量太大了,要系统管理员的你每天去看这么多的讯息数据,想不疯掉都很难,这个时候,我们就可以透过『正规表示法』的功能,将这些登录的信息进行处理,仅取出『错误』的信息来进行分析,哈哈!如此一来,你的系统管理工作将会『快乐得不得了』啊!当然,正规表示法的优点还不止于此,等您有一定程度的了解之后,您会爱上他喔!<br> <li><b><font color="#000099">正规表示法的广泛用途:</font></b></li><br>除了系统管理员之外,一大堆的软件与设定都是支持正规表示法的,最常见的例子就是『邮件服务器』啦!何解?您是否有常常收到电子邮件里最让人诟病的『广告信件』呢?那如果我在Server端就将广告信件给剔除的话,客户端就会减少很多不必要的频宽损耗了对吧!那么如何剔除广告信件呢?由于广告信件几乎都有一定的标题或者是内容,因此,只要每次有来信时,都先将来信的标题与内容进行特殊字符串的比对,发现有不良信件就予以剔除!嘿!这个工作怎么达到啊?就使用正规表示法啊!目前两大服务器软件sendmail 与 postfix都支持正规表示法的比对功能!棒的很~当然还不止于此啦,很多的服务器软件、以及套件都支持正规表示法呢!当然,虽然各家软件都支持他,不过,这些『字串』的比对还是需要系统管理员来加入比对规则的,所以啦!身为系统管理员的你,为了自身的工作以及客户端的需求,正规表示法实在是很需要学习的一项工作呢!<br> <li><b><font color="#000099">正规表示法与 Shell 在 Linux 当中的角色定位:</font></b></li><br>说实在的,我们在学数学的时候,一个很重要、但是粉难的东西是一定要『背』的,那就是九九表,背成功了之后,未来在数学应用的路途上,真是一帆风顺啊!这个九九表我们在小学的时候几乎背了一整年才背下来,并不是这么好背的呢!但他却是基础当中的基础!您现在一定受惠相当的多呢^_^!而我们谈到的这个正规表示法,与前一章的 <a href="http://linux.vbird.org//linux_basic/0320bash.php">BASHshell</a> 就有点像是数学的九九表一样,是 Linux 基础当中的基础,虽然也是最难的部分,不过,如果学成了之后,一定是『大大的有帮助』的!不论是对于系统的认识与系统的管理部分,他都有很棒的扶助啊!所以啰,请好好的学习这个基础吧!^_^<br> <li><b><font color="#000099">正规表示法的严谨度:</font></b></li><br>认知到正规表示法的重要性之后,而且也了解了 RE 的主要用途,接下来得谈一谈的是,那么<font color="#000066">正规表示法的严谨度怎么分</font>啊?华特( What ) ?正规表示法还有『严谨度』之分?当然有啊!你可以使用较为松散的RE 去找寻一篇文章的内容,也可以使用较为严谨的方式去搜寻更准确的内容 ( 有点类似Google 里面的『模糊比对』啦! ^_^ ) 举个简单的例子来说,如果你要找寻 car这个字眼时,那么会连 careful 也一并当作结果来输出~真是抱歉....这个时候,使用更为严谨的正规表示法,将cat 前后的字符限制不可接受英、数字,那就可以得到更为准确的 cat 这个独立单字的字眼了!很棒不是吗!底下我们将先以较为基础的RE 来做介绍,而后将介绍较为严谨的『延伸正规表示法』,清一清脑门,准备用功啦!^_^</ul><hr width="100%"><a name="basic_regexp"></a><font size="+1" color="#000099">基础正规表示法<font face="SimSun">:</font></font><ul> <br> <br><hr width="100%"><li><a name="grep"></a><b><font color="#000099" face="SimSun">grep</font></b></li><br><font color="#ff0000"> </font><br><font color="#ff0000">语法</font>:<table bgcolor="#000000" border="1" cols="1" width="550"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[root @test/root ]# </font><font color="#ffff00">grep [-acinv] '搜寻字符串' filename</font></font><br><font size="-1" color="#ff6666" face="SimSun">参数说明:</font><br><font size="-1" color="#ffffcc" face="SimSun">-a :将 binary档案以 text 档案的方式搜寻数据</font><br><font size="-1" color="#ffffcc" face="SimSun">-c :计算找到'搜寻字符串' 的次数</font><br><font size="-1" color="#ffffcc" face="SimSun">-i :忽略大小写的不同,所以大小写视为相同</font><br><font size="-1" color="#ffffcc" face="SimSun">-n :顺便输出行号</font><br><font size="-1" color="#ffffcc" face="SimSun">-v :反向选择,亦即显示出没有'搜寻字符串' 内容的那一行!</font><br><font size="-1" color="#ff6666" face="SimSun">范例:</font><br><font size="-1" face="SimSun"><font color="#ffffff">[root @test/root]# </font><font color="#ffff00">grep 'root' /var/log/secure </font></font><br><font size="-1" color="#ff9900" face="SimSun">将 /var/log/secure这个档案中有 root 的那一行秀出来</font><p><font size="-1" face="SimSun"><font color="#ffffff">[root @test/root]# </font><font color="#ffff00">grep -v 'root' /var/log/secure</font></font><br><font size="-1" color="#ff9900" face="SimSun">若该行没有root 才将数据秀出来到屏幕上!</font></p><p><font size="-1" face="SimSun"><font color="#ffffff">[root @test/root]# </font><font color="#ffff00">last | grep root</font></font><br><font size="-1" color="#ff9900" face="SimSun">若该行有root 才将数据秀出来到屏幕上!</font></p><p><font size="-1" face="SimSun"><font color="#ffffff">[root @test/root]# </font><font color="#ffff00">grep [A-Z]ANPATH /etc/man.config</font></font><br><font size="-1" color="#ff9900" face="SimSun">将 /etc/man.config这个档案当中,所有有:</font><br><font size="-1" color="#ff9900" face="SimSun">[任何一个大写字符]后面接ANPATH 的那一行就显示出来!</font><br><font size="-1" color="#ff9900" face="SimSun">例如 AANPATH,BANPATH.... ZANPATH 等等!</font></p></td></tr></tbody></table><font color="#ff0000">说明</font><font color="#000000">:</font><br>grep 是一个很常见的指令,最重要的功能就是进行字符串数据的比对了,需要说明的是『<font color="#000066">grep在一个档案中查寻一个字符串时,他是以"整行"为单位来数据的撷取的!</font>』也就是说,假如一个档案内有10 行,其中有两行具有你所搜寻的字符串,则将那两行显示在屏幕上,其它的就丢弃了!而grep 除了可以进行档案的资料搜寻之外,也常常被应用在 input/output 的数据处理当中,例如常见的管线命令( pipe ) 就可以常常见到他的踪影!以上面的例子来看,我们可以发现前两个例子是查寻档案的内容,有没有加上-v 所显示出来的结果是『相反的!』,而第三个例子则是以 pipe 的功能进行数据的处理的喔!至于最后一个例子比较特殊,使用到中括号[] ,这是什么意思呢?<br> <br><font face="SimSun"><font color="#000066">在中括号里面『只有一个字符』,而里面的内容就是『字符的范围』啦!所以呢[A-Z]就是指:『A到Z当中的任何一个字符都能被接受,但是只有一个字符』的意思</font>!所以,如果我想要所有的数字都接受,那就是[0-9],如果我只要接受1,3,5 呢?就是[135]或者可以用逗号隔开[1,3,5]!所以啦,那个<font color="#000066">减号- 在中括号当中,代表『一个范围(range)</font>』的意思啦!中括号还有很多用途呢!底下会更详细介绍!</font><br> <br>grep 是最简单的正规表示法搜寻指令之一,他并不支持一些更严谨的正规表示法内容,不过,已经相当的好用啦!底下我们就以一个档案做为练习吧!先来查看一下这个档案内容:<br> <table bgcolor="#000000" border="1" cols="1" width="550"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[root @test/root ]# </font><font color="#ffff00">vi regexp.txt</font></font><br><font size="-1" color="#ffffff" face="SimSun">This is a cat,however, I need a dog.</font><br><font size="-1" color="#ffffff" face="SimSun">I want to "Happy"and <Happy> and /Happy/ here.</font><br><font size="-1" color="#ffffff" face="SimSun">* I don't knowhow to do this *</font><br><font size="-1" color="#ffffff" face="SimSun"># I don't Knowhow to do this $</font><br><font size="-1" color="#ffffff" face="SimSun">^ I don't KNOWhow to do this @</font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -