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

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

三、grep及正则表达式实例

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

grep 简介

      grep : global search regular expression=\'#\'" )  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的串,并以高亮显示其匹配的字符串。
1
[root@lgh01 ~]# grep --color=auto
"root"
/etc/passwd

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

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

1
[root@lgh01 ~]# grep --color=auto
"^root"
/etc/passwd

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

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

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


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

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

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

1
[root@lgh01 ~]# grep --color=auto -i ftp /etc/passwd

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

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

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

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

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

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

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

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

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

spacer.gif
例十:
显示/etc/rc.d/rc.sysinit文件中的内容,并不显示以#号开头的行和空白行。

1
[root@lgh01 ~]# grep -v
'^#'
/etc/rc.d/rc.sysinit | grep -v
'^$'

spacer.gif
例十一:显示IPV4的地址信息的行,排除lo回环地址。
1
2
[root@lgh01 ~]# ip add list | egrep
"[[:space:]]+inet[^6].*[^lo]$"
[root@lgh01 ~]# ifconfig | egrep
"[[:space:]]+inet[^6].*"
| grep -v
127.0
.
0.1

spacer.gif
例十二:找出ifconfig不包含回环地址的其它IP地址,不包括IP广播地址和子网掩码等信息。

1
[root@lgh01 ~]# 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])\>"

spacer.gif
这个看起来真是有些头痛 ,不过多看几遍就好了,我们分解一下在看看是不是就容易很多了。
"\
<([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 命令功能、正则表达式先简单介绍到这里了,希望对大家有所帮忙,本篇博文后续还会继续更新,后续更新主要以实例为主。希望大家关注啊!