鸟哥正.docx

上传人:b****3 文档编号:6674047 上传时间:2023-05-10 格式:DOCX 页数:32 大小:42.51KB
下载 相关 举报
鸟哥正.docx_第1页
第1页 / 共32页
鸟哥正.docx_第2页
第2页 / 共32页
鸟哥正.docx_第3页
第3页 / 共32页
鸟哥正.docx_第4页
第4页 / 共32页
鸟哥正.docx_第5页
第5页 / 共32页
鸟哥正.docx_第6页
第6页 / 共32页
鸟哥正.docx_第7页
第7页 / 共32页
鸟哥正.docx_第8页
第8页 / 共32页
鸟哥正.docx_第9页
第9页 / 共32页
鸟哥正.docx_第10页
第10页 / 共32页
鸟哥正.docx_第11页
第11页 / 共32页
鸟哥正.docx_第12页
第12页 / 共32页
鸟哥正.docx_第13页
第13页 / 共32页
鸟哥正.docx_第14页
第14页 / 共32页
鸟哥正.docx_第15页
第15页 / 共32页
鸟哥正.docx_第16页
第16页 / 共32页
鸟哥正.docx_第17页
第17页 / 共32页
鸟哥正.docx_第18页
第18页 / 共32页
鸟哥正.docx_第19页
第19页 / 共32页
鸟哥正.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

鸟哥正.docx

《鸟哥正.docx》由会员分享,可在线阅读,更多相关《鸟哥正.docx(32页珍藏版)》请在冰点文库上搜索。

鸟哥正.docx

鸟哥正

引用:

   

 正规表示法RegularExpression,RE

正规表示法(或称为常规表示法)是透过一些特殊字符的排列,用以搜寻/取代/删除一列或多列文字字符串,简单的说,正规表示法就是用在字符串的处理上面的一项『表示式』。

正规表示法并不是一个工具程序,而是一个字符串处理的标准依据,如果您想要以正规表示法的方式处理字符串,就得要使用支持正规表示法的工具程序才行,这类的工具程序很多,例如vi,sed,awk等等。

正规表示法对于系统管理员来说,实在是很重要。

因为系统会产生很多的讯息,这些讯息有的重要,有的仅是告知,此时,管理员可以特过正规表示法的功能来将重要讯息撷取出来,并产生便于查阅的报表,简化管理流程。

此外,很多的软件包也都支持正规表示法的分析,例如邮件服务器的过滤机制(过滤垃圾信件)就是很重要的一个例子。

所以,您最好要了解正规表示法的相关技能,在未来管理主机时,才能够更精简处理您的日常事务!

注:

本章节使用者需要多加练习,因为目前很多的套件都是使用正规表示法来达成其『过滤、分析』的目的,为了未来主机管理的便利性,使用者至少要能看的懂正规表示法的意义!

1.前言:

2.基础正规表示法:

  2.1以grep撷取字符串

  2.2重要特殊字符(characters)

3.延伸正规表示法:

4.格式化打印:

printf

5.sed工具简介

6.awk工具简介

7.文件数据比对与打印的相关功能

  7.1档案比对:

diff,cmp,patch

  7.2档案打印准备:

pr

8.重点回顾

9.参考资源

10.本章习题练习

--------------------------------------------------------------------------------

前言

约略了解了Linux的基本指令(Shell)并且熟悉了vi之后,相信您对于敲击键盘与指令比较不陌生了吧?

接下来,底下要开始介绍一个很重要的观念,那就是所谓的『正规表示法』啰!

--------------------------------------------------------------------------------

什么是正规表示法

任何一个有经验的系统管理员,都会告诉您:

『正规表示法真是挺重要的!

』为什么很重要呢?

因为日常生活就使用的到啊!

举个例子来说,在您日常处理文书作业时,应该会常常使用到『搜寻/取代』等等的功能吧?

这些举动要作的漂亮,就是正规表示法的工作了!

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

举例来说,我要找到VBird或Vbird这个字样,但是不要其它的字符串,该如何办理?

如果在没有正规表示法的环境中(例如MSword),您或许就得要使用忽略大小写的办法,或者是分别以VBird及Vbird搜寻两遍。

但是,忽略大小写可能会搜寻到VBIRD/vbird/VbIrD等等的不需要的字符串,而造成使用者的困扰。

再举个系统常见的例子好了,假设妳发现系统在开机的时候,老是会出现一个关于mail程序的错误,而开机过程的相关程序都是在/etc/rc.d/底下,也就是说,在该目录底下的某个档案内具有mail这个关键词,好了,此时,您怎么找出来含有这个关键词的档案?

您当然可以一个档案一个档案的开启,然后去搜寻mail这个关键词,只是.....该目录底下的档案可能不止100个说~如果了解正规表示法的相关技巧,那么只要一行指令就找出来啦!

『grep'mail'/etc/rc.d/*』那个grep就是支持正规表示法的工具程序之一!

如何~很简单吧!

^_^y

谈到这里就得要进一步说明了,正规表示法基本上是一种『表示法』,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正规表示法的字符串处理之用。

也就是说,例如vi,grep,awk,sed等等工具,因为她们有支持正规表示法,所以,这些工具就可以使用正规表示法的特殊字符来进行字符串的处理。

--------------------------------------------------------------------------------

正规表示法对于系统管理员的用途

那么为何我需要学习正规表示法呢?

对于一般使用者来说,由于使用到正规表示法的机会可能不怎么多,因此感受不到他的魅力,不过,对于身为系统管理员的您来说,正规表示法则是一个『不可不学的好东西!

』怎么说呢?

由于系统如果在繁忙的情况之下,每天产生的讯息信息会多到你无法想象的地步,而我们也都知道,系统的『错误讯息登录档案』的内容(这部份我们在第五篇会详谈)记载了系统产生的所有讯息,当然,这包含你的系统是否被『入侵』的纪录数据。

但是系统的数据量太大了,要身为系统管理员的你每天去看这么多的讯息数据,从千百行的资料里面找出一行有问题的讯息,呵呵~光是用肉眼去看,想不疯掉都很难!

这个时候,我们就可以透过『正规表示法』的功能,将这些登录的信息进行处理,仅取出『有问题』的信息来进行分析,哈哈!

如此一来,你的系统管理工作将会『快乐得不得了』啊!

当然,正规表示法的优点还不止于此,等您有一定程度的了解之后,您会爱上他喔!

--------------------------------------------------------------------------------

正规表示法的广泛用途

正规表示法除了可以让系统管理员管理主机更为便利之外,事实上,由于正规表示法强大的字符串处理能力,目前一堆软件都支持正规表示法呢!

最常见的就是『邮件服务器』啦!

如果您留意因特网上的消息,那么应该不能发现,目前造成网络大塞车的主因之一就是『垃圾/广告信件』了,而如果我们可以在主机端,就将这些问题邮件剔除的话,客户端就会减少很多不必要的频宽耗损了。

那么如何剔除广告信件呢?

由于广告信件几乎都有一定的标题或者是内容,因此,只要每次有来信时,都先将来信的标题与内容进行特殊字符串的比对,发现有不良信件就予以剔除!

嘿!

这个工作怎么达到啊?

就使用正规表示法啊!

目前两大邮件服务器软件sendmail与postfix以及支持邮件服务器的相关分析套件,都支持正规表示法的比对功能!

当然还不止于此啦,很多的服务器软件、以及套件都支持正规表示法呢!

当然,虽然各家软件都支持他,不过,这些『字符串』的比对还是需要系统管理员来加入比对规则的,所以啦!

身为系统管理员的你,为了自身的工作以及客户端的需求,正规表示法实在是很需要也很值得学习的一项工具呢!

--------------------------------------------------------------------------------

正规表示法与Shell在Linux当中的角色定位

说实在的,我们在学数学的时候,一个很重要、但是粉难的东西是一定要『背』的,那就是九九表,背成功了之后,未来在数学应用的路途上,真是一帆风顺啊!

这个九九表我们在小学的时候几乎背了一整年才背下来,并不是这么好背的呢!

但他却是基础当中的基础!

您现在一定受惠相当的多呢^_^!

而我们谈到的这个正规表示法,与前一章的BASHshell就有点像是数学的九九表一样,是Linux基础当中的基础,虽然也是最难的部分,不过,如果学成了之后,一定是『大大的有帮助』的!

这就好像是金庸小说里面的学武难关,任督二脉,打通任督二脉之后,武功立刻成倍成长!

所以啦,不论是对于系统的认识与系统的管理部分,他都有很棒的辅助啊!

请好好的学习这个基础吧!

^_^

--------------------------------------------------------------------------------

延伸的正规表示法

正规表示法除了简单的一组字符串处理之外,还可以作群组的字符串处理,例如进行搜寻VBird或netman或lman的搜寻,注意,是『或(or)』而不是『和(and)』的处理,此时就需要延伸正规表示法的帮助啦!

藉由特殊的(与|等字符的协助,就能够达到这样的目的!

好啦!

清清脑门,咱们用功去啰!

Tips:

有一点要向大家报告的,那就是:

『正规表示法与万用字符是不一样的东西!

』这很重要喔!

因为万用字符(wildcard)所代表的意义与正规表示法并不相同~要分的很清楚才行喔!

所以,学习本章,请将前一章bash的万用字符意义先忘掉吧!

--------------------------------------------------------------------------------

基础正规表示法

既然正规表示法是处理字符串的一个标准表示方式,他需要支持的工具程序来辅助,所以,我们这里就先介绍一个最简单的字符串撷取功能的工具程序,那就是grep啰!

在介绍完grep的基本功能之后,就进入正规表示法的特殊字符的处理能力了。

--------------------------------------------------------------------------------

以grep撷取字符串

既然要使用grep当然就得要先了解一下grep的语法啰~

[root@testroot]#grep[-acinv]'搜寻字符串'filename

参数说明:

-a:

将binary档案以text档案的方式搜寻数据

-c:

计算找到'搜寻字符串'的次数

-i:

忽略大小写的不同,所以大小写视为相同

-n:

顺便输出行号

-v:

反向选择,亦即显示出没有'搜寻字符串'内容的那一行!

范例:

[root@testroot]#grep'root'/var/log/secure

将/var/log/secure这个档案中有root的那一行秀出来

[root@testroot]#grep-v'root'/var/log/secure

若该行没有root才将数据秀出来到屏幕上!

[root@testroot]#last|greproot

若该行有root才将数据秀出来到屏幕上!

grep是一个很常见也很常用的指令,他最重要的功能就是进行字符串数据的比对,然后将符合使用者需求的字符串打印出来。

需要说明的是『grep在数据中查寻一个字符串时,是以"整行"为单位来进行数据的撷取的!

』也就是说,假如一个档案内有10行,其中有两行具有你所搜寻的字符串,则将那两行显示在屏幕上,其它的就丢弃了!

而grep除了可以进行档案的资料搜寻之外,也常常被应用在input/output的数据处理当中,例如常见的管线命令(pipe)就可以常常见到他的踪影!

以上面表格中的例子来看,我们可以发现前两个例子是查寻档案的内容,有没有加上-v所显示出来的结果是『相反的!

』,而第三个例子则是以pipe的功能进行数据的处理的喔!

好了,我们就开始以grep来进行正规表示法的简易说明吧!

我们先以底下这个档案来作为范例:

[root@testroot]#viregular_express.txt

"OpenSource"isagoodmechanismtodevelopprograms.

appleismyfavoritefood.

Footballgameisnotusefeetonly.

thisdressdoesn'tfitme.

However,thisdressisabout$3183dollars.

GNUisfreeairnotfreebeer.

Herhairisverybeauty.

Ican’tfinishthetest.

Oh!

Thesouptastegood.

motorcycleischeapthancar.

Thiswindowisclear.

thesymbol'*'isrepresentedasstart.

Oh!

Mygod!

Thegdsoftwareisalibraryfordraftingprograms.

Youarethebestismeanyouaretheno.1.

Theworldisthesamewith"glad".

Ilikedog.

googleisthebesttoolsforsearchkeyword.

goooooogleyes!

go!

go!

Let'sgo.

#IamVBird

需要特别注意的是,上面这个档案鸟哥是在Windows的环境下编辑的,并且经过特殊处理过,因此,他虽然是纯文字文件,但是内含一些Windows环境下的软件常常自行加入的一些特殊字符,例如断行字符(^M)就是一例!

所以,您可以直接将上面的文字以vi储存成regular_express.txt这个档案,不过,比较建议直接点底下的连结下载:

http:

//linux.vbird.org/linux_basic/0330regularex/regular_express.txt

此外,因为不同的语系编码是不一样的,所以,您必须要将语系改成英文语系,才能够进行底下的测试,否则,可能会有显示的内容与底下的输出不符的状况喔!

修改语系的方法为:

[root@testroot]#LANG=en

[root@testroot]#LANGUAGE=en

好了,现在开始我们一个案例一个案例的来介绍吧!

例题一、搜寻特定字符串:

搜寻特定字符串很简单吧?

假设我们要从刚刚的档案当中取得the这个特定字符串,最简单的方式就是这样:

[root@testroot]#grep-n'the'regular_express.txt

8:

Ican'tfinishthetest.

12:

thesymbol'*'isrepresentedasstart.

15:

Youarethebestismeanyouaretheno.1.

16:

Theworldisthesamewith"glad".

18:

googleisthebesttoolsforsearchkeyword.

那如果想要『反向选择』呢?

也就是说,当该行没有'the'这个字符串时,才显示在屏幕上,那就直接使用:

[root@testroot]#grep-vn'the'regular_express.txt

您会发现,屏幕上出现的行列为除了8,12,15,16,18五行之外的其它行列!

接下来,如果您想要取得不论大小写的the这个字符串,则:

[root@testroot]#grep-in'the'regular_express.txt

8:

Ican'tfinishthetest.

9:

Oh!

Thesouptastegood.

12:

thesymbol'*'isrepresentedasstart.

14:

Thegdsoftwareisalibraryfordraftingprograms.

15:

Youarethebestismeanyouaretheno.1.

16:

Theworldisthesamewith"glad".

18:

googleisthebesttoolsforsearchkeyword.

例题二、利用[]来搜寻集合字符

如果我想要搜寻test或taste这两个单字时,可以发现到,其实她们有共通的't?

st'存在~这个时候,我可以这样来搜寻:

[root@testroot]#grep-n't[ae]st'regular_express.txt

8:

Ican'tfinishthetest.

9:

Oh!

Thesouptastegood.

了解了吧?

其实[]里面不论有几个字符,他都谨代表某『一个』字符,所以,上面的例子说明了,我需要的字符串是『tast』或『test』两个字符串而已!

而如果想要搜寻到有oo的字符时,则使用:

[root@testroot]#grep-n'oo'regular_express.txt

1:

"OpenSource"isagoodmechanismtodevelopprograms.

2:

appleismyfavoritefood.

3:

Footballgameisnotusefeetonly.

9:

Oh!

Thesouptastegood.

18:

googleisthebesttoolsforsearchkeyword.

19:

goooooogleyes!

但是,如果我不想要oo前面有g的话呢?

此时,可以利用在集合字符的反向选择[^]来达成

[root@testroot]#grep-n'[^g]oo'regular_express.txt

2:

appleismyfavoritefood.

3:

Footballgameisnotusefeetonly.

18:

googleisthebesttoolsforsearchkeyword.

19:

goooooogleyes!

意思就是说,我需要的是oo,但是oo前面不能是g就是了!

仔细比较上面两个表格,妳会发现,第1,9行不见了,因为oo前面出现了g所致!

第2,3行没有疑问,因为foo与Foo均可被接受!

但是第18行明明有google的goo啊~别忘记了,因为该行后面出现了tool的too啊!

所以该行也被列出来~也就是说,18行里面虽然出现了我们所不要的项目(goo)但是由于有需要的项目(too),因此,是符合字符串搜寻的喔!

至于第19行,同样的,因为goooooogle里面的oo前面可能是o,例如:

go(ooo)oogle,所以,这一行也是符合需求的!

再来,假设我oo前面不想要有小写字符,所以,我可以这样写[^abcd....z]oo,但是这样似乎不怎么方便,由于小写字符的ASCII上编码的顺序是连续的,因此,我们可以将之简化为底下这样:

[root@testroot]#grep-n'[^a-z]oo'regular_express.txt

3:

Footballgameisnotusefeetonly.

也就是说,当我们在一组集合字符中,如果该字符组是连续的,例如大写英文/小写英文/数字等等,就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字符串是数字与英文呢?

呵呵!

就将他全部写在一起,变成:

[a-zA-Z0-9]

例如,我们要取得有数字的那一行,就这样:

[root@testroot]#grep-n'[0-9]'regular_express.txt

5:

However,thisdressisabout$3183dollars.

15:

Youarethebestismeanyouaretheno.1.

这样对于[]以及[^]以及[]当中的-有了解了吗?

^_^y

例题三、行首与行尾字符^$:

我们在例题一当中,可以查询到一行字符串里面有the的,那如果我想要让the只在行首列出呢?

这个时候就得要使用定位字符了!

我们可以这样做:

[root@testroot]#grep-n'^the'regular_express.txt

12:

thesymbol'*'isrepresentedasstart.

此时,就只剩下第12行,因为只有第12行的行首是the开头啊~此外,如果我想要开头是小写字符的那一行就列出呢?

可以这样:

[root@testroot]#grep-n'^[a-z]'regular_express.txt

2:

appleismyfavoritefood.

4:

thisdressdoesn'tfitme.

10:

motorcycleischeapthancar.

12:

thesymbol'*'isrepresentedasstart.

18:

googleisthebesttoolsforsearchkeyword.

19:

goooooogleyes!

如果我不想要开头是英文字母,则可以是这样:

[root@testroot]#grep-n'^[^a-zA-Z]'regular_express.txt

1:

"OpenSource"isagoodmechanismtodevelopprograms.

20:

#IamVBird

注意到了吧?

那个^符号,在字符集合符号(括号[])之内与之外是不同的!

在[]内代表『反向选择』,在[]之外则代表定位在行首的意义!

要分清楚喔!

那如果我想要找出来,行尾结束为小数点(.)的那一行,该如何处理:

[root@testroot]#grep-n'\.$'regular_express.txt

1:

"OpenSource"isagoodmechanismtodevelopprograms.

2:

appleismyfavoritefood.

3:

Footballgameisnotusefeetonly.

4:

thisdressdoesn'tfitme.

10:

motorcycleischeapthancar.

11:

Thiswindowisclear.

12:

thesymbol'*'isrepresentedasstart.

15:

Youarethebestismeanyouaretheno.1.

16:

Theworldisthesamewith"glad".

17:

Ilikedog.

18:

googleisthebesttools

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2