很多时候我们都有文本检索的需要,比如我们使用@H_404_2@windows的时候,经常会在某个@H_404_2@doc或@H_404_2@txt文档中搜索自己想要的内容。而在使用@H_404_2@linux的过程中,我们同样会遇到文本检索的场景。@H_404_2@
在@H_404_2@linux环境下,我们使用@H_404_2@grep,egrep及@H_404_2@fgrep,来实现文本检索的功能。由于@H_404_2@grep,egrep支持使用正则表达式来表示匹配模式,使得@H_404_2@linux环境下的文本检索功能变得非常强大。下面我们就来详细描述下何为@H_404_2@grep,以及使用正则表达式配合@H_404_2@grep实现文本检索的方法。@H_404_2@
一,什么事正则表达式?@H_404_2@
很难用比较通俗的语言来描述,暂且复制各种百科里的内容过来。@H_404_2@
如百科所说,“正则表达式使用单个字符串来描述一系列某个句法规则的字符串”,其中@H_404_2@“单个字符串@H_404_2@”是掌握正则表达式的关键和难点,这个内容会在第三部分中以@H_404_2@grep为例来详细描述。@H_404_2@
grep [OPTIONS] PATTERN[FILE...]
这是帮助文档中给出的信息,其中@H_404_2@“PATTERN”即指上文所说的@H_404_2@”单个字符串@H_404_2@”,是比较难以掌握的部分,也是@H_404_2@grep能够完成复杂搜索任务的关键因素,当然@H_404_2@“PATTERN”也可以是简单的字符串。这部分我们仅使用简单字符串,重点介绍@H_404_2@grep的基本用法及一些常用的@H_404_2@“OPTIONS”。@H_404_2@
举例@H_404_2@1:在@H_404_2@/etc/passwd文件中搜索包含有“@H_404_2@root”字符串的行。@H_404_2@
这个就是@H_404_2@grep最简单的用法,@H_404_2@/etc/passwd文件中包含“@H_404_2@root”字符串的行被打印至屏幕。此外,@H_404_2@grep还给定了一些选项,使得我们在搜索时更为快捷。@H_404_2@
--color:表示给搜索到的字符串添加颜色,很好用的一个功能,也比较简单,在此不做过多说明。以下的例子中我们已定义@H_404_2@alias grep=”grep �color”。@H_404_2@
-o:表示仅显示匹配到的内容,例一加上@H_404_2@-o选项则会看到如下结果@H_404_2@:
grep -o “root” /etc/passwd
-i:表示不区分大小写。@H_404_2@
例@H_404_2@2,在@H_404_2@/tmp/test/目录下编写包含有@H_404_2@ROOT,ROOt,root的文件@H_404_2@greptest,执行@H_404_2@
grep -i "root" /tmp/test/greptest
看到如下结果@H_404_2@:
-v:表示不能被模式匹配到的行@H_404_2@
三,使用正则表达式配合@H_404_2@grep完成搜索任务。@H_404_2@
由于@H_404_2@grep支持使用正则表达式来表示@H_404_2@“PATTERN”,使得其功能变得异常强大,下面我们就来介绍一下正则表达式配合@H_404_2@grep搜索的一些常用方法。@H_404_2@
正则表达式由元字符及正常字符组成,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能;元字符是书写和理解正则表达式的关键,下面就来说说一些常见的元字符。@H_404_2@
1,表示字符匹配的元字符@H_404_2@
.:点号表示匹配任意单个字符,例如在@H_404_2@/etc/passwd文件中搜索@H_404_2@r后跟两个任意字符,然后是@H_404_2@t的行,就可以用@H_404_2@grep "r..t" /etc/passwd
[]:表示匹配指定范围内的任意单个字符。@H_404_2@
[^]:表示指定范围外的任意单个字符。@H_404_2@
在正则表达式中匹配指定范围的字符集合有以下常用表达:@H_404_2@
[0-9]表示匹配任意单个数字,与@H_404_2@[[:digit:]]相同。@H_404_2@
[a-z]表示匹配任意单个小写字母。@H_404_2@
[A-Z]表示匹配任意单个大写字母。@H_404_2@
[a-zA-Z]:表示匹配任意单个字母,同@H_404_2@[[:alpha:]]。@H_404_2@
[[:punct:]]表示匹配任意标点符号。@H_404_2@
[[:space:]]表示匹配空白字符,包括空格和制表符。@H_404_2@
[0-9a-zA-Z]表示匹配所有的字母和数字,同@H_404_2@[[:alnum:]]。@H_404_2@
举例:在@H_404_2@/etc/rc.d/rc.sysinit文件中搜索出现了@H_404_2@n或@H_404_2@N,且其后是非字母的行,就可以使用@H_404_2@grep "[nN][^[:alpha:]]" /etc/rc.d/rc.sysinit来表示@H_404_2@
在此,给出一个我在学习中犯的一个错误:搜索@H_404_2@/etc/rc.d/rc.sysinit中出现了@H_404_2@no或@H_404_2@No的行。这道题的答案应该是@H_404_2@grep “[nN]o“ /etc/rc.d/rc.sysinit而不是@H_404_2@ grep �i no/etc/rc.d/rc.sysinit,
因为后一个命令匹配到的是@H_404_2@no,@H_404_2@No,@H_404_2@NO这三种结果。@H_404_2@
*:表示匹配其前面字符任意次。@H_404_2@
\?:表示匹配其左侧字符@H_404_2@0次或@H_404_2@1次。@H_404_2@
\+:表示匹配其左侧字符@H_404_2@1次或多次。@H_404_2@
\{m\}:表示精确匹配其左侧字符@H_404_2@m次。@H_404_2@
\{m,n\}:表示其左侧字符出现的次数在@H_404_2@m和@H_404_2@n之间才能被模式匹配到。@H_404_2@
\{m,\}:表示其左侧字符至少出现@H_404_2@m次才能被搜索到。@H_404_2@
举例:@H_404_2@
1)找出@H_404_2@/etc/passwd中@H_404_2@o连续出现两次的行@H_404_2@
2)找出@H_404_2@grep.test中@H_404_2@a之后@H_404_2@b出现了一次或两次的行。@H_404_2@
3,位置限定。@H_404_2@
使用正则表达式,除了能表达字符的种类和次数以外,还能指定字符出现的位置,下面介绍下,常用的锚定位置的表示方法。@H_404_2@
^:表示锚定行首@H_404_2@
$:表示锚定行尾。@H_404_2@
\< :锚定词首,也可用@H_404_2@\b
\> :锚定词尾,也可以用@H_404_2@\b
举例:找出@H_404_2@/etc/passwd文件中包含@H_404_2@fedora的行@H_404_2@
4,分组引用@H_404_2@\(\)
分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被@H_404_2@grep记忆(保存于内置的变量中,这些变量是@H_404_2@\1,\2,...),因此,还可以被引用;@H_404_2@
\1: 引用,模式中自左而右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;@H_404_2@
\2: 引用@H_404_2@,模式中自左右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容@H_404_2@
比如:@H_404_2@\(ab\(cd\)mn\)\1 \2,@H_404_2@\1表示@H_404_2@abcdmn,而@H_404_2@\2表示@H_404_2@cd。@H_404_2@
举例:找出@H_404_2@/etc/passwd文件中以@H_404_2@passwd开头且以@H_404_2@passwd结尾的文件@H_404_2@