首页 > 代码库 > grep前传之侠影之谜 (Grep begins)

grep前传之侠影之谜 (Grep begins)

一、自述

 

 

       我叫grep,是同你们一样,生活在都市里。每天做着重复的事,忙碌着。

说起来这个好笑,我生活的国家叫Bourne-Again Shell,因为我国来往人多,大家读者不便,于是心口不一的叫它“bash”。bash,呵呵,好像被狠狠的砸了一下。

眼前这座烂尾楼便是我藏身的地方,它叫/bin,这里的居民都是上班族,那天下班后我数了一下用户,发现114个住户!天哪,好一座危楼!

wKioL1PBa1KC-CbaAAAiupj0uFI710.jpg

在这个国家每家每户都供奉着一尊雕像,它叫root,对了,我和我的家人(group)都属于它,无理由的信奉着它,对它无怨无悔的奉献。不信你看:

wKioL1PBa5PQnvgPAAA9E5Biv6o576.jpg

也许你留意了,我还是个10后,理应被呵护,但是没办法,咳咳,还是每天要工作

好了,也许你不喜欢我的blabla,让我告诉你一个有趣的,就是我的工作。

自打我从娘胎里出生,我就被一个叫man的人口普查局记录了,我的所有信息都被他们管理,也许是天赋异禀,我天生就有寻踪访迹的能力,而且异常强大,任何楼里任何人有骚动,root都会过来找我,说,喂,给我查一下/etc小区里/passwd大楼里cla的信息!

wKiom1PBbuSy3v-uAABgLSBIxCw887.jpg我把所有的情报无偿的给root,博得他莞尔一笑,结果他头也不回,拿着情报走了。

而在这个bash世界里,你所依赖的就是叫hash的hit值,所获得多报酬就多,反之,则..wKioL1PCJZbyRN3GAADaN2uKwrw832.jpg

今天13个值,可以勉强凑合一天了。

 

 

二、死党和超能力

 

 

嗯,突然忘了提一个死党,他是我的邻居,他叫fgrep,人们曾经特别拥戴他,爱称他叫快搜侠。只不过有一次执行火速的工作时,线索很零散,会用到尽是些类似( \. \* \+), fgrep发现自己无法进入/etc/passwd大厦里精确查找,他愣在当场,不知所措,root一个大嘴巴把他从云彩扇到沟里了。poor guy....

至于我,grep,天生就具有一种叫做“REGULAR EXPRESSIONS”的超能力,他们就爱称这种超能力叫做“正则表达式”,如果当时我在现场, 一定可以根据

( \. \* \+)这些尤物来完成那个火速任务可惜,历史不能假设。

 

 

三、阳春白雪 != globbing

 

其实,我干的最多的活儿就是穿梭于各个目录楼宇(/)之间对每个房间进行寻踪,至于有一次root让我做一种叫globbing的工作,让我找出一个藏匿于/tmp大通铺下的一个叫pddd.txt的bad guy,我死活找不到,即便root怎么指使我。

wKioL1PCLVHgs5eHAABtg481Z18539.jpg

我只能拿着这个1的结果灰头土脸的给root,于是似乎他放弃了让我使用这种叫globbing的东西,我想迄今我还有用的应该是超能力REGULAR EXPRESSIONS。

 

 

四、超能力使用手册

 

以下是我的超能力的几种使用方法,

1、我可以把一个不确定的因素转化成“ ." 没错这个红色的小药丸让我可以把任何人留下的字符理解成.

2、[]   []是个很神奇的东西,是一个让我可以从里面取任何人留下的任何数字和字母,不管你是0-9还是a-z抑或是A-Z,

我会把[0123456789]的东西看做任何一个,只要你要,我就可以取出这样的一个。

 

 [[:digit:]] 被我识别成任意“一个”数字

 [[:alpha:]] 被我识别成任意“一个”字母
 [[:alnum:]] 任意“一个”数字或字母

 [[:space:]] 任意“一个”空格

 [[:punct:]] 任意“一个”标点符号

甚至我还可以根据[[:upper:]]找出任意一个大写字母

              [[:lower:]]找出任意一个小写字母

我还支持这个逻辑:caret 即 ^ 脱字符,把它加入任意的范围,我就能取出反向查找。

3、对于重复

当我在工作时,通常是要抓紧时间的,所以下面几个小东西就帮了我大忙,它们会对前面一个字符重复,提高我的工作效率

3-1 

对于前面一个字符可以不重复,或者重复一次。

3-2  +

对于前面一个字符可以重复一次,或者许许多多次。

3-3  *

对于前面一个字符可以重复任意次。

甚至我可以辨认{ }这种格式,举个例子吧

假设你要重复前面的字符最少2次,最多3次。

也可以使用\{2,\3},我也会辨别。

!!!!由于出生设定,在你使用一些特殊字符进行次数重复的时候,必须在符号前面加入“  \ ”表示转义,方便我辨识。

加上限制,没错,我可以支持。

假如条件要求在行的行首,加入"^"符号,若在行尾可以在"$"。这里就有个小技巧

假如你要我找出空白的行,可以使用"^$",这样就能表示空白!

wKioL1PCOvOQXdNSAACFP_JaGFc388.jpg

看!的确有这个行存在!在第39行,很神奇,不是么?

还有一种限制的方法,我支持"\<"和"\>",它们表示在一个词的词首和词尾做限制

假定我要在/etc/passwd里明确找出cla这个家伙的信息,here we go:

wKiom1PCPRDxjGKiAAB9vbEdRJI383.jpg

对于一些组,我有我的办法

假定我要取出一行头尾词组的相同的方法

wKioL1PCQvTyMvTBAAFN71GGHOM540.jpg

可以使用\(\)的方法!

 

五、biohazrd基因突变

 

自从那天root给我注射了一种叫-E的血清,致使我一时无法摆脱,霎时间难辨真伪。它叫extended!当我带着这个状态工作时,我可以忽视"\"这个障碍,久而久之,我发现它另一个古怪的地方,我可以进行“或”的方法了!

wKioL1PCRcvhwjW6AAFXnEdPZrA366.jpg

但是至今还有无法突破\<,\>这两个大关,当我要做词首词尾限定时,仍然使用\。也许就是血清的副作用吧。

这就是黑夜里我的工作方式,穿梭在都是1/0的大街,翱翔在bash的世界里。说不定在这个我每天游走的世界,还有一个跟我长得很像的兄弟......甚至是否还是两个跟我一样拥有“超能力”的人呢?

本文出自 “标题可以空” 博客,请务必保留此出处http://libincla.blog.51cto.com/6249823/1437612