一、基本用法
       grep是linux中很常用的一个命令,主要功能就是进行字符串数据的对比,能使用正则表达式搜索文本,并将符合用户需求的字符串打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。grep在数据中查找出一个字符串时,是以整行为单位来进行数据选取的。
1、命令格式
       grep [cinvs] 'patten' filename
2、主要参数
       -c:只输出匹配行的计数。
       -i:不区分大小写(只适用于单字符)。
       -n:显示匹配行及行号。
       -s:不显示不存在或无匹配文本的错误信息。
       -v:显示不包含匹配文本的所有行。
3、patten

       要搜索的关键字或正则表达式语句,正则表达式参见后文。
4、简单实例
       #netstat -nap|grep 80
       上面命令查询监听80端口的行。
       #grep -n "world" hello.txt
       查询文件hello.txt中含有"world"字符串的行,并显示行号。
       #grep -n "printf" main.c hello.c world.c
        在源码文件main.c、hello.c和world.c中查询调用了printf函数的行,并显示行号。
       #grep -n "printf" *
       在当前目录的所有文件中查询调用了printf函数的行,并显示行号。也可以指定路径,比如:/usr/local/include/*。
       #grep -r "printf" *
       在当前目录及所有子目录下递归查找调用了printf函数的行,并显示行号。

二、正则用法
       grep patten正则表达式主要元字符及使用如下表:

元字符

例子

love开头的行$

锚定行的结束/love$/

匹配所有以

l,紧跟着两个字符,然后是*

代表

0个或多个空格,空格后跟着[]

匹配字符组中的一个字符/[Ll]ove/

匹配所有包含Love的行[^]

匹配一个不在范围内的字符/[^A-Z]ove/

love开头的单词(grep支持这个功能)>

锚定单词的结束Love>

匹配所有这样的行,这些行包含以vi

9个标签。第一个标签是模板最左边的部分。在本例子中,模板1,后面的love;本例子搜索的是这样的行,这些行包含这样的字符,在lovers

M次复制字符x{m,}

至少x

m次,至多x

[A-Za-z0-9]

L字符,紧跟着e

love

       简单实例如下:

       #ls -l | grep '^a'

       通过管道过滤ls -l输出的内容,只显示以a开头的行。

       #grep 'test' d*

       显示所有以d开头的文件中包含test的行。

       #grep '[a-z]\{5\}' aa

       显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

       #grep 'w\(es\)t.*\1' aa

       如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用"\"号进行转义,直接写成'w(es)t.*\1'就可以了。


三、其它家族

       grep家族除了有grep命令外,还包括egrep和fgrep。

       egrep是grep的扩展,支持更多的正则元字符,具体如下:

+

匹配一个或者多个先前字符

[a-z]+ove

匹配一个或者多个小写字符且后面是ove的,

?

匹配0个或者多个先前字符

Lo?ve

匹配L后面有一个或者没有o,然后是ve

a|b|c

匹配a或b或c

Love|hate

匹配love或hate其中一个

()

字符组

Love(able|rs)(ov)+

匹配loveable或lovers,匹配一个或多个ov

(…)(…)12

标记匹配字符串

(love)ing

标签标记出寄存器的一部分,并稍后替换模板。该模板叫做1,并可反复引用。在表达式中最多可以使用9个这样的标签。例如,模板love被保存在寄存器1中并稍后替换标签叫做1

x{m}

重复字符X,m次,至少m,或者m次和n次之间。

x{m,}

x{m,n}

       fgrep是fixed grep或fast grep,它把所有的字母都看作单词,即正则元字符不再特殊,而仅仅表示其自身的字母意思。