首页 > 代码库 > Linux系统的grep以及正则表达式浅析!

Linux系统的grep以及正则表达式浅析!

   grep命令可以从文本中或者通过管道送过来的字符流中或一个"-"符号代替文件名来搜索精确或者模糊的匹配信息,grep家族有三个命令:grep,egrep,fgrep。

       grep支持正则表达式匹配查找

       egrep支持扩展正则表达式匹配查找

       fgrep不支持正则表达式匹配查找

   grep命令的格式:

       grep [OPT] ‘PATTERN‘ FILE  

           PATTERN是所需要匹配的内容

               精确匹配中单双引号的含义相同

               如果PATTERN是精确匹配(即只有普通字符不包含元字符)且字符串中间不包含空格,则引号可以省略

               如果PATTERN是精确匹配但字符串中间包含空格,则必须使用引号

               模糊匹配中单双引号的使用条件

               如果PATTERN是模糊匹配(即包含元字符)则也必须使用引号:

                   如果使用单引号则PATTERN中所有字符都不能转义

                   如果使用双引号PATTERN中只有$ `` \ 这三个字符可以转移

           OPT是grep支持的各种选项

               通用信息的选项

                   -V    显示grep的版本信息


               匹配原则的选项

                   -E    表示grep将支持扩展正则表达式,不再支持常规正则表达式,grep -E == egrep

               匹配控制的选项

                   -e PATTERN    支持匹配多个字符串,每个字符串都要带-e选项来区分,多个字符串之间匹配时是或的关系

                                 -e选项还可以用来匹配字符串中的"-",通常grep的PATTERN中出现-,grep会将其视为选项而不是字符串  

                       例:        grep -e "STRING1" -e "STRING2" ... -e "STRINGn" FILE        

                   -f FILE       可以将需要匹配的多个字符串写入一个文件,每个匹配内容为一行,以FILE代替PATTERN,实现多个或关系的字符串匹配

                       例:        grep -f FILE_PATTERN FILE  

                   -i            忽略PATTERN中的大小写

                   -v            显示和PATTERN内不匹配的行

                   -w            根据PATTERN内容匹配:

                                       精确地单词,单词的两边必须是非字符符号(即不能是字母数字或下划线)

                                       锚定单词首或单词尾

                   -x            精确匹配整行内容(包括行首行尾那些看不到的空格内容都要完全匹配)

               通用信息的选项

                   -c            显示匹配的行数(不会输出匹配的内容)

                   --color=      输出带有颜色的匹配内容(使用环境变量GREP_COLORS中预先定义好的颜色)

                                 --color={auto|always|never}    不是很明白,有待后期继续补充

                   -L            在多个文件中查找匹配时,只输出不包含匹配内容的文件名

                   -l            在多个文件中查找匹配时,只输出包含匹配内容的文件名

                   -m NUM        当匹配内容的行数达到NUM行后,grep停止搜索,并输出停止前搜索到的匹配内容

                   -o            只输出匹配的具体字符串,匹配行中其他内容不会输出

                   -q            安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0

                   -s            不会输出查找过程中出现的任何错误消息

                                 -q和-s选项因为与其他系统的grep有兼容问题,所以不建议使用,而是使用重定向方式也可以达到相同的效果

               输出信息前缀控制

                   -b            输出每一个匹配行(或匹配的字符串)时在其前附加上偏移量(从文件第一个字符到该匹配内容之间的字节数)

                   -H            在每一个匹配行之前加上文件名一起输出(针对于查找单个文件),当查找多个文件时默认就会输出文件名

                   -h            无论查找几个文件都不会在匹配内容前输出文件名

                   -n            输出匹配内容的同时输出其所在行号

                   -T            在匹配信息和其前的附加信息之间加入tab以使格式整齐

                   -Z            在输出内容包含文件名的情况下,使文件名后面不再跟随其他字符(如不再跟随默认的冒号)

                   -A NUM        输出匹配行另加其下面的NUM行          

                   -B NUM        输出匹配行另加其上面的NUM行  

                   -C NUM        输出匹配行另加其上面和下面各NUM行

               文件和目录的选择控制

                   -a            将一个二进制文件当做文本文件来处理

                   --binary-files=TYPE    不是很明白,有待后期继续补充

                                   without-match    相当于-I选项

                                   text

                   -D ACTION     如果Input是一个device,FIFO或socket,则需要使用ACTION来处理,默认的ACTION是read,其他还有skip  不是很明白,有待后期继续补充

                   -d ACTION     如果input是一个目录,将使用ACTION对其处理    不是很明白,有待后期继续补充

                                 ACTION:

                                       read        将目录视为普通文件来读取

                                       skip        跳过

                                       recurse     递归读取该目录下的所有子目录下的文件,相当于-r选项

                   --exclude=GLOB    搜索其文件名和GLOB通配符相匹配的文件的内容来查找匹配

                                 使用方法:

                                           grep -H --exclude=c* "old" ./*  

                                               c*是通配文件名的通配符

                                               ./*    指定需要先通配文件名的文件的范围,必须要给*,不然就匹配不出内容,(如果不给*,带上-r选项也可以匹配)

                   --include=GLOB    搜索其文件名和GLOB通配符相匹配的文件之外的其他文件的内容来查找匹配

                   --exclude-from=FILE        在文件中编写通配方案,grep将不会到匹配方案中文件名的文件去查找匹配内容

                   --exclude-dir=DIR    匹配一个目录下的很多内容同时还要让一些子目录不接受匹配,就使用此选项

                                      grep -H -r --exclude-dir=2* "old" ./*

                       -I            

                   -R -r         递归查找

               其它选项

                   --mmap        启用mmap系统调用代替read系统调用

                   -U            默认grep读取windows系统文件时会通过读取文件前32K内容来猜测文件类型,如果判定是文本文件,则会去掉文本中的CR符号

                                 -U选项否决了此种猜测方式,而是逐个的进行文件内容匹配,来判断文件类型

   egrep和fgrep的格式是相同的,只不过PATTERN部分支持的正则表达式不同


   正则表达式

       成为regular expression,是由一系列常规字符和元字符组合而成来实现匹配

       元字符:不表示字符本身的含义,而用于额外功能性描述

           .            匹配任意单个字符

           []           匹配指定任意范围内的单个字符

                   例:    [abc]    表示单个a或单个b或单个c中的一个字符

           [^]          匹配指定任意范围外的单个字符

                   例:    [^abc]   表示非a且非b且非c的单个字符

           *            匹配其前的单个字符0或多次

                        *默认是贪婪模式,匹配的越长越好

                   例:    eraxbuicdbdir这个字符串中我要匹配a.*b,其结果是axbuicdb而不是axb,这就是贪婪模式

           ?            和*类似,但是匹配其前的单个字符0或1次

           \{ , \ }     精确匹配其前单个字符的次数(\是起到阻止转义的作用)

                        \{m,n\}    匹配至少m次,至多n次
                        \{m,\}     匹配至少m次
                        \{0,n\}    匹配至多n次
                        \{m\}      匹配m次

           锚定符号

           \<(\b)       锚定单词首部    \<WORD

           \>           锚定单词尾部    WORD\>

           ^            锚定行首    ^要放在PATTERN的最前面  

           $            锚定行尾    $要放在PATTERN的最后面

           分组与引用

           \(\)         将\(STRING\)中的STRING当做一个整体来引用

                        \(STRING\)...\1    \1代表第一次引用前面STRING内容,一次匹配中也可以有多次分组\NUM就表示引用第NUM个分组

           \            这是阻止任何元字符转义的字符,\后面的单个字符只能表示为其字符表面含义

                   例:

                       ab\*    这个字符串是ab*,*不再代表匹配任意次其前面的字符b

   扩展正则表达式

       其支持的元字符和标准正则表达式稍有区别

           +            匹配+前的一个字符1次或多次      
           |            STR1|STR2|STR3,支持以字符串为一个整体进行单个字符串的匹配    
           ()           分组    (ab)*

                        引用的方法同标准正则表达式  
                        ()+          表示多个重复的分组    
           {}           匹配精确次数,和标准正则表达式语法相同

           需要注意:    ? + | ( ) { }在扩展表达式中都不回转义,所以不需要在其前面加上\,不然会报错。
   

          正则表达式更加详细的内容,留待后续补充!!
































             of which is to be matched.  (-F is specified by POSIX.)

本文出自 “卫斯理初涉linux” 博客,请务必保留此出处http://rick008.blog.51cto.com/3349394/1410588