软实力提升之道11------全面搜索正则表达式并把行打印出来
嗯,当你看到这样一个标题时有什么想法?一头雾水还是心中暗爽"幸亏我知道"。不管怎么样,这是软实力提升之道的又一篇文章,最近总觉得自己写的东西很浅显,很容易被高手鄙视,算了,罢了,本来就是小白,还是和需要的人一起提升软实力吧。
Global search Regular Expression and Print out the line,就是我们常说的GREP,也就是上面的那个标题。这个东东是个强大的文本搜索工具。在Linux和UNIX中广泛使用。
如果要说grep就要提一下它的兄弟:egrep、fgrep。grep和后面的程序基本相同,通过-E或者-E来调用后面的两个命令。
在古老的UNIX文本编辑器ED(这玩意儿诞生的时候中国的文化大革命还没高潮)中有个命令:
:g/re/p |
这个命令的作用是通过搜索整个文件匹配给定正则表达式,并且把相应的行打印出来。ED是最早支持正则表达式的文本工具之一。它的作者ken. Thompson根据UC BERKLY的QED的思路发展而来。ED在文本编辑领域的影响力如此之大,它的后裔中vi,并影响了AWK和PERL的诞生。
基本原理
grep的工作过程一般分三步:
- 1. 将一行文本读入模式空间
- 2. 对模式空间中的文本进行正则表达是处理
- 3. 针对匹配结果进行处理
grep的语法格式如下
grep [options] PATTERN [FILE...] grep [options] [-e PATTERN | -f FILE] [FILE...] |
如果我们想在fruit文件中搜索包含apple字符串的行。grep如下命令:
grep apple fruit |
如果我们还想匹配Apple或者aPPle其它,就需要用到-i,表示ignore-case的意思,就是忽略大小写。
[root@vv grept]# cat fruit applet Applet banana Orange Strawberry [root@vv grept]# grep apple fruit applet [root@vv grept]# grep -i apple fruit applet Applet |
正则表达式元字符集包括基本集和扩展集。grep支持的是基本集。前面提到过的egrep支持扩展集。
元字符 | 说明 |
^ | 行首定位,指定行的头部。'^apple'匹配所有以apple开头的字符串 |
$ | 行尾定位,指定行的尾部。'apple$'匹配所有以apple结尾的字符串 |
. | 匹配任意一个字符。'app.e'匹配apple、appoe或者其它。 |
* | 匹配0个或者多个前导字符。学过闭包的应该知道。 |
[] | 匹配[]中任意一个字符,'app[lo]e'会匹配apple或者appoe。 |
[^] | []元字符相反 |
/< >/ | 词首定位和词首定位符,注意和^$的区别。下面有实例说明。 |
x/{m, n/} | m代表前导字符数量的下限,n代表下限 |
行首定位和词首定位的区别:
[root@vv grept]# cat fruit applet Applet banana Orange Strawberry aaaa pple pple [root@vv grept]# grep '^pple' fruit pple [root@vv grept]# grep '/<pple' fruit aaaa pple pple [root@vv grept]# |
这篇的重点在grep,所以正则表达式的内容就不多介绍了。
-#
同时显示匹配行的上下#行
[root@vv grept]# cat fruit applet Applet banana Orange Strawberry aaaa pple pple [root@vv grept]# grep -2 'banana' fruit applet Applet banana Orange Strawberry |
-l
grep匹配时,只打印匹配的文件名,不打印其中的行。
[root@vv grept]# grep -l 'banana' * fruit |
grep另外一个使用比较广泛的地方是用在管道中。比如显示某一进程。假设我们要显示vi进程的运行情况。
[root@vv grept]# ps aux | grep "vi" root 29649 0.4 0.1 5228 1444 pts/1 T 20:22 0:00 vi root 29693 0.0 0.0 4212 728 pts/1 S+ 20:23 0:00 grep vi |
grep在shell中的使用也很广泛。在shell中我们比较注意的就是grep的退出状态。通过下面的实例,就可以看到grep对退出状态有哪几种了。
[root@vv grept]# grep 'apple' fruit applet [root@vv grept]# echo $? 0 [root@vv grept]# grep 'applebbb' fruit [root@vv grept]# echo $? 1 [root@vv grept]# grep 'applebbb' fruit2 grep: fruit2: No such file or directory [root@vv grept]# echo $? 2 |