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

一、自述

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

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

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

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

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

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

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

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

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

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

二、死党和超能力

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

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

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

三、阳春白雪 != globbing

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

我只能拿着这个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},我也会辨别。

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

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

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

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

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

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

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

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

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

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

五、biohazrd基因突变

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

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

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

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

时间: 2024-11-07 16:09:13

grep前传之侠影之谜 (Grep begins)的相关文章

Vue.js 入门指南之“前传”(含sublime text 3 配置)

题记:关注Vue.js 很久了,但就是没有动手写过一行代码,今天准备入手,却发现自己比菜鸟还菜,于是四方寻找大牛指点,才终于找到了入门的“入门”,就算是“入门指南”的“前传”吧.此文献给跟我一样“白痴级别”的前端开发人员,大牛请绕过. 1,下载安装Node.js 去 Node.js 官网下载一个Windows环节的安装包 node-v6.2.0-x64.rar 文件,一路安装下去即可.官网访问很慢,可以试试中文网 http://nodejs.cn/ 2,配置Vue环境 一开始看<基于Webpac

前传——一个文科生转行做编程的参考样本

动笔                                                                                                                                                                                      听闻前辈讲述写博客的诸多好处,早有开始写「技术博客」的想法,但囿于自身浅薄的「技术」,以及轻微的强迫症——总想准备充分后下笔——比如

大数据Spark蘑菇云前传第15课:Scala类型参数编程实战及Spark源码鉴赏(学习笔记)

前传第15课:Scala类型参数编程实战及Spark源码鉴赏 本課課程: Spark源码中的Scala类型系統的使用 Scala类型系統编程操作实战 Spark源码中的Scala类型系統的使用 classOf[RDD[_]] 這個也是类型系統 這里的意思是說 B 這種類型必需至少是 A 這樣類型 Ordering Scala类型系統编程操作实战 作為類型系統最大的就可以對類型進行限制,在Scala 中的類型系統,他本身也作為對象.e.g. 我們可以建立 Person 這個類,現在可以建立一個什麼

SpringMVC深度探险(一) —— SpringMVC前传

本文是专栏文章(SpringMVC深度探险)系列的文章之一,博客地址为:http://downpour.iteye.com/blog/1330537 在我们熟知的建立在三层结构(表示层.业务逻辑层.持久层)基础之上的J2EE应用程序开发之中,表示层的解决方案最多.因为在表示层自身的知识触角很多,需要解决的问题也不少,这也就难免造成与之对应的解决方案层出不穷. 笔者在很多讨论中经常可以看到类似“某某框架已死”,或者“某某框架已经足以打败所有其他的框架”的言论.事实上,每一种解决方案都有着自身独有的

uboot学习前传

uboot的学习前传 为什么要有uboot uboot主要作用是启动操作系统内核的. uboot还要负责部署整个计算机系统. uboot中还要有操作flash等板子上的硬件驱动 uboot还得提供一个命令行让我们可以在命令行下可以进行操作 uboot就是干以上或者更多事情的一个裸机程序而已. 计算机系统组成的三个重要部件: CPU + 外部存储器(flash/硬盘) + 内部存储器(内存, DDR/SDRAM/SRAM) PC机的启动过程: 在静态时,BIOS程序放在norflash中,在PC机

止增笑耳的星际迷航前传

假期闲来无事,看了几部影碟,其中尤以星际迷航11前传(2009年上映)不得不让人吐槽.这么一部漏洞百出的糟粕,在豆瓣评分居然还高达7.9分,实在是让人有些诧异豆瓣文青的水平. bug实在太多,现将之细数如下,欢迎补充: 1.企业号的形状根本就不是一个战舰,在这一集里居然还能攻击其他星舰,而其他剧集里都是比较强调它的速度,曲速前进什么的,这才是对的: 2.Kirk船长等人,哦,不,应该叫神啊,到任何星球执行任务居然都能像在地球一样随便呼吸,完全抛开头套: 3.这个系列的所有剧集都完全没有重力差异的

无应答前传消息流程

无应答前传 激活无应答呼叫前转业务后,当电话响铃无人接听,电话会自动转移到事前设定的号码上. INVITEsip:[email protected]:5060;transport=udp SIP/2.0 Via: SIP/2.0/UDP192.168.11.137:5060;rport;branch=z9hG4bK1075141334 From: "1003"<sip:[email protected]:5060;user=phone>;tag=387369502 To:&

Vue.js 入门指南之“前传”

题记:关注Vue.js 很久了,但就是没有动手写过一行代码,今天准备入手,却发现自己比菜鸟还菜,于是四方寻找大牛指点,才终于找到了入门的“入门”,就算是“入门指南”的“前传”吧.此文献给跟我一样“白痴级别”的前端开发人员,大牛请绕过. 1,下载安装Node.js 去 Node.js 官网下载一个Windows环节的安装包 node-v6.2.0-x64.rar 文件,一路安装下去即可.官网访问很慢,可以试试中文网 http://nodejs.cn/ 2,配置Vue环境 一开始看<基于Webpac

无条件前传

该项服务允许一个用户对于他的呼入呼叫可以转到另一个号码.使用该业务时对该用户号码的所有呼叫,不管被叫用户是在什么状态,都自动转到一个预先指定的号码. 例如:用户3000设置无条件前传3001:用户2000呼叫3000,此时3001振铃,显示主叫号码2000.详细消息流程如下: A (2000)          IPBX               C(3001) |----invite(3000)-->------|------invite(3001)--->-----| |----<