一、grep简介以及命令参数选项

二、正则表达式简介及元字符、字符集合

三、grep及正则表达式实例

-------------------------------------------------------------------------------------------------------------------

grep 简介


       grep : global search regular expression(RE)  and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
       grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
       grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

grep 命令:

格式:grep [OPTIONS] PATTERN [FILE...]
         grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

【选项与参数】(这里只介绍比较常用的选项,想了解更多请使用man grep查看)
--color=auto:高亮显示匹配到的字符串;
-v --invert-match:反向选取,只显示不符号模式的行
-o --only-matching:只显示被模式匹配到的字串,而不是整个行;
-i --ignore-case:不区分字符大小写
-l --files-with-matches:只列出匹配的文件名;
-L --files-without-matches:只列出不匹配的文件名;
-w --word-regexp:匹配完整字符串(单词),而不是匹配部分字符串;
-A NUM:显示匹配到的行,并显示其后面的NUM行
-B NUM:显示匹配到的行,并显示其前面的NUM行
-C NUM:显示匹配到的行,并显示其前、后面的NUM行
-E --extended-regexp:支持扩展正则表达式

正则表达式简介

       任何一个有经验的系统管理员,都会告诉你:正则表达式真是挺重要的!为什么很重要呢?因为日常生活就使用得到。举个例子
来说,在你日常使用vim做文字处理或编写程序时使用到的查找、替换等功能,这些举动要做得漂亮,就得要配合正则表达式来处理!
       简单的说,正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式一般通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。正则表达式包括:基本正则表达式,扩展正则表达式;

基本正则表达式:贪婪模式(尽可能长地去匹配符合模式的内容)

元字符:
^:锚定行首的符合条件的内容,用法格式“^pattern”;
$:锚定行尾的符合条件的内容,用法格式“pattern$”;
.:匹配任意单个字符
*匹配紧挨在其前面的字符任意次
.*匹配任意长度的任意字符
[]匹配包含内的任一字单个字符
[^]匹配包含外的任一字单个字符
\将下一字符标记为特殊字符、文本、反向引用或八进制转义符
\?匹配紧挨在其前面的字符0次或1次;
\<锚定词首
\>锚定词尾
x\{m\}匹配其前面的字符“x”m次(精确匹配);
x\{m,\}匹配其前面的字符“x”至少m次;
x\{m,n\}匹配其前面的字符“x”至少m次,至多n次;
\(\):分组

字符集合:
[:lower:]:代表小写字母,即 a-z
[:upper:]:代表大写字母,即 A-Z
[:digit:]:代表数字,即 0-9
[:alpha:]:代表任何英文大小写字母,即 a-z A-Z
[:alnum:]:代表英文大小字符及数字,即 0-9 a-z A-Z
[:space:]:代表空格键与Tab按
[:punct:]:代表标点符号,即 “  , ;? ! : # $


grep及正则表达式实例:

  通过以上对grep命令、正则表达式、元字符、字符集合的简单介绍,下面我们来举些例子,让大家更好的了解grep命令及正则表达式的基本使用,并更好的了解命令的参数 、选项,正则表达式的元字符及字符集合的意义:

例一:在/etc/passwd文件中查找匹配root的串,并以高亮显示其匹配的字符串。
[[email protected] ~]# grep --color=auto "root" /etc/passwd

Linux grep 命令功能、正则表达式

--color=auto 可将正确匹配的字符串以高亮红色显示。


例二:在/etc/passwd文件中查找以root开头的行,并将其显示。

[[email protected] ~]# grep --color=auto "^root" /etc/passwd

Linux grep 命令功能、正则表达式

通过行首锚定符进行匹配,可以看出此次匹配的内容仅是以root开头的行。在其它位置出现不匹配。


例三:在/etc/passwd文件中查找以/bin/bash结尾的行,并将其显示。
[[email protected] ~]# grep --color=auto "/bin/bash$" /etc/passwd

Linux grep 命令功能、正则表达式

通过行尾锚定符进行匹配,可以看出此次匹配的内容仅是以/bin/bash结尾的行。


例四:在/etc/passwd文件中查找匹配ftp的行。
[[email protected] ~]# grep --color=auto ftp /etc/passwd

Linux grep 命令功能、正则表达式

大家注意到没有,此行还包含一个大写“FTP”字符串,这里没有匹配出来,从这个例子中可以看出,grep命令进行字符匹配是区分大小写字母的。


例五:在/etc/passwd文件中查找匹配ftp的行。不区分大小写。

[[email protected] ~]# grep --color=auto -i ftp /etc/passwd

Linux grep 命令功能、正则表达式

大家看看和上一个命令的区别,就很容易发现,通过-i参数,不区分大小写进行匹配,所以大、小写的ftp都匹配出来了。


例六:在/etc/passwd文件中查找匹配bin的字符串,要完全匹配,不能匹配类似sbin的字串。
[[email protected] ~]# grep --color=auto "\<bin\>" /etc/passwd

Linux grep 命令功能、正则表达式

通过词首"\<"、词尾"\>"锚定符进行字符串完全匹配。如果不使用词首词尾锚定符,会将类似/sbin字串一起匹配出来。


例七:在/etc/passwd文件中查找匹配两个ftp之间包含任意字符的行。
[[email protected] ~]# grep --color=auto "\(ftp\).*\1" /etc/passwd

Linux grep 命令功能、正则表达式

ftp字符串以分组方式进行匹配,大家注意到命令中的\1,表示引用第一个分组的内容,如果字符串中有多个分组,可以用\2 \3进行引用第二分组及第三分组中的字符串。


例八:在/etc/passwd文件中查找匹配o,并且至少出现2次的字符串的行。
[[email protected] ~]# grep --color=auto 'o\{2,\}' /etc/passwd

Linux grep 命令功能、正则表达式

\{2,\} 匹配前面字符至少2次,表示o字符最少必须连续出现两次或三次或更多次,例:rooot 、spoooot、toooools等。


例九:显示/etc/rc.d/rc.sysinit中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行。

[[email protected] ~]# grep '^#[[:space:]]\{1,\}[^[:space:]]*' /etc/rc.d/rc.sysinit

Linux grep 命令功能、正则表达式

Linux grep 命令功能、正则表达式
例十:显示/etc/rc.d/rc.sysinit文件中的内容,并不显示以#号开头的行和空白行。

[[email protected] ~]# grep -v '^#' /etc/rc.d/rc.sysinit | grep -v '^$'

Linux grep 命令功能、正则表达式

Linux grep 命令功能、正则表达式
例十一:显示IPV4的地址信息的行,排除lo回环地址。
[[email protected] ~]# ip add list | egrep "[[:space:]]+inet[^6].*[^lo]$" 或
[[email protected] ~]# ifconfig | egrep "[[:space:]]+inet[^6].*" | grep -v 127.0.0.1

Linux grep 命令功能、正则表达式

Linux grep 命令功能、正则表达式

Linux grep 命令功能、正则表达式
例十二:找出ifconfig不包含回环地址的其它IP地址,不包括IP广播地址和子网掩码等信息。

[[email protected] ~]# ifconfig |egrep --color "\<([1-9]|[1-9][0-9]|1[0-1]+[0-9]+|12[^7]+|1[3-9]+[0-9]|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"

Linux grep 命令功能、正则表达式

Linux grep 命令功能、正则表达式
这个看起来真是有些头痛 ,不过多看几遍就好了,我们分解一下在看看是不是就容易很多了。
"\<([1-9]|                         :1-9
[1-9][0-9]|                        :10-99
1[0-1]+[0-9]+|                 :100-199
12[^7]+|                           :120-129  排除127
1[3-9]+[0-9]|                    :130-139
2[01][0-9]|                        :200-219
22[0-3])\>    :220-223
(\.\<([0-9]|                       :0-9
[1-9][0-9]|                        :10-99
1[0-9][0-9]|                      :100-199
2[0-4][0-9]|                      :200-249
25[0-4])\>):250-254
{2}    精确匹配前面分组2次
\.\<([1-9]|                             :1-9
[1-9][0-9]|                            :10-99
1[0-9][0-9]|                          :100-199
2[0-4][0-9]|                          :200-249
25[0-4])\>"  :250-254


Linux grep 命令功能、正则表达式先简单介绍到这里了,希望对大家有所帮忙,本篇博文后续还会继续更新,后续更新主要以实例为主。希望大家关注啊!