一、正则表达式(grep):

1.1 基本概念:

   grep: (global search regular expression(RE) and print out the line,即全面搜索正则表达式并把行显示出来,正则表达式是一种强大的文本搜索工具,能够根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行。

1.2 语法规则:

   通过man命令可以看到grep命令的语法规则:

wKioL1MEvBWDSWBPAABnGCRNrYk970.jpg

1.3 grep中的常用选项:

(1)--color=auto:自动显示颜色。

例如:过滤出/etc/passwd文件中含有root的字符并显示出其颜色:

wKiom1MEwavzetlcAABloOnjclA165.jpg

(2)-v: 反向,显示不能被模式所匹配到的行。

例如:显示出/etc/passwd文件中不是以“/sbin/nologin”结尾的行:

wKioL1MExD6C3hImAACXBvHHs48919.jpg

(3)-o: 仅显示被模式匹配到的字串,而非整行。

例如:只显示出/etc/passwd文件中含有root的字符:

wKioL1MExiuhTNhJAAAyxGRI5Ck060.jpg

(4)-i: 不区分字符大小写, 即ignore-case。

例如:显示/etc/passwd下以大小写s开头的行:

wKioL1MIBfqRlB4oAAC6cSYiGwI038.jpg

(5)-E: 支持扩展的正则表达式,通常grep命令后面加-E选项,就成为扩展的正则表达式。

例如:过滤出/proc/meminfo下面含有“SwapFree”的字段:

wKiom1MICAyioDEUAAA-PZFU_wI905.jpg

(6)-A #:“#”代表数字,显示被模式匹配到的行以及后面的#行。

例如:显示出/etc/shadow中含有root字段的行以及该行的下面一行:

wKioL1MICnHQ-0t_AACPwxqxf48807.jpg

(7)-B #:“#”代表数字,显示被模式匹配到的行以及前面的#行。

例如:显示出/etc/issue中含有http字段的行以及该行前面的3行:

wKioL1MIDBCjlp5iAABVRhoyJ1Q950.jpg

(8) -C #:“#”代表数字,显示被模式匹配到的行以及该行的前后#行。

显示出/boot/grub/grub.conf中以“#boot”开头的行以及该行的前后2行:

wKiom1MIDeWSobp4AAB-hTVcNMU932.jpg

1.4 grep是一类字符所书写出的模式(pattern),模式中的元字符不表示字符本身的意义,只是用于额外功能性的描述,下面介绍元字符的用法:

(1).: 代表匹配任意单个字符。

例如:显示出/etc/passwd中以“r”开头,以“t”结尾,中间跟了任意2个字符的字符串的行:

wKiom1MIEPuA6D2zAABxW8faONo544.jpg

注意:模式中一旦有字符,就必须用引号引上,模式中如果做了变量引用的话就必须用双引号引上,其他情况单引号和双引号都行,例如:

wKiom1MIE-2Bci4-AACKfIWz3MY069.jpg

说明:上面的图例中,先声明的变量city的值为beijing,然后对citys这个文件中含有$city的行进行过滤,$city加了双引号后表示引用的变量city的值,如果$city加了单引号就表示显示出$city这个字符串。

(2)[0-9]或[[:digit:]]:表示匹配0到9之间的任意一个数字。

例如:显示出/etc/passwd中以5开头,而后跟着任意一个数字,最后以任意字符结尾的字符串的行:

wKiom1MIGLeypCxvAAB93_D4AV8794.jpg

(3)[a-z]或[[:lower:]]:表示匹配任意一个小写字母。

例如:显示出/etc/shadow中以r开头,然后跟着任意一个小写字母的字符串的行:

正则表达式grep和扩展正则表达式egrep的总结_第1张图片

(4)[A-Z]或[[:upper:]]:表示匹配任意一个大写字母。

例如:显示出/etc/passwd中以P开头,然后跟着任意一个大写字母的字符串的行:

wKioL1MIHJSS92zVAABXdeL2uuI969.jpg

(5)[[:alpha:]]:表示匹配任意一个大小字母。

例如:显示出/etc/issue中以任意一个大小字母开头以s结尾的字符串的行:

wKiom1MIHvTx1MPPAABBZ945tyk972.jpg

(6)[[:alnum:]]:表示匹配任意一个大写字母或小写字母或数字。

例如:显示出/etc/passwd中以x开头,然后跟着任意一个大小写字母或数字的字符串的行:

wKiom1MIIJyAVYrOAAA6eeqqgQQ388.jpg

(7)[[:space:]]:表示匹配一个空格。

例如:显示出/etc/issue中以一个空格开头,然后跟着任意一个数字的字符串的行:

wKioL1MIIpLgVdU2AABCKiMj4Es261.jpg

(8)[[:punct:]]:表示匹配一个任意一个标点符号。

例如:显示出/etc/issue中以一个空格开头,然后跟着任意一个标点符号的字符的行:

wKioL1MIMVLgdNvSAABTso91fEo392.jpg

(9)[^]:表示指定范围外的任意单个字符。

例如:显示出/etc/init.d/atd中以#开头的行,并且#后面跟着一个非空字符:

wKiom1MIM2GhDb3RAABMraNDAII971.jpg

(10)$:表示以某某结尾的行。

例如:显示/etc/issue中以m结尾的行:

wKiom1MINfmTYwhCAABAAAHUZOU398.jpg

(11)*: 表示匹配前面的一个字符出现任意次。

例如:x*y就代表x可以出现0次或0次以上,如下图:

wKiom1MIOIzxRnQoAAA1bepRzy8672.jpg

说明:*属于次数匹配,用来指定匹配其前面的字符的次数。

(12)\?: 表示匹配前面的字符只能出现0次或1次。

例如:x\?y表示x只能出现0次或一次:

wKioL1MISKbzFineAAAvcLL2eLY625.jpg

说明:字符匹配工作在贪婪模式,它会尽可能长的去匹配字符。

(14).*:表示任意长度的任意字符。

例如:显示出/etc/passwd中以r开头,中间跟了任意长度的任意字符,以2到5之间任意一个数字结尾的字符串的行:

wKiom1MITG6AtOlKAADCaJGuCcI814.jpg

(13)\{m\}: 表示前面的字符可以出现m次。

例如:显示出/etc/issue中http只能出现一次的行:

wKioL1MITlfCz5HrAAA6UZodjd0056.jpg

(14)\{m,\}: 表示其前面的字符至少出现m次。

例如:显示出/etc/passwd中root至少出现一次的行:

wKiom1MIT76i6QFzAABQEr6DQW0477.jpg

(15)\{0,n\}:表示其前面的字符至多出现n次。

例如:显示出/etc/shadow中sshd最多出现1次:

wKiom1MIUc_zD8XDAAA0REzFaIg409.jpg

(16)\{m,n\}:表示前面的字符最少出现m次,最多出现n次:

例如:

正则表达式grep和扩展正则表达式egrep的总结_第2张图片

(17)^: 锚定行首。

例如:过滤出/etc/passwd中以大小写r开头,以大小写t结束,中间跟着0个以上非标点符号的行:

wKioL1MIVZaAPd_NAABq7_Jmt0c413.jpg

(18)$:锚定行尾。

例如:显示出/etc/passwd中以bash结尾的行:

wKioL1MIVqHg9wbUAABXyRQnfgY977.jpg

说明:^和$都属于位置锚定,用于指定字符出现的位置。

(19)^$:表示空白行。

例如:统计出/etc/rc.d/rc.sysinit中的空白行的行数:

wKiom1MIWGWBOshxAAAz1LPBILQ107.jpg

(20)\

例如:显示出/etc/passwd中单词root:

wKiom1MIW4LhZg3MAABG1gJxfxw780.jpg

(21)char\>或char\b: 锚定词尾。

例如:显示出/etc/passwd中单词home:

wKioL1MIXGmxeqGWAAA7GG08vW0973.jpg

(22)\(\):分组,匹配小括号中的多个字符。

例如:显示出/etc/passwd中以rt开始,然后后面跟着任意一个字符的行:

wKiom1MIXmuBKlyiAAB3uADV8r8045.jpg

(23)\1,\2,\3,...\n:分组引用,表示引用前面第一个、第二个、第三个到第n个括号的字符串。

例如:找出当前系统上其用户名和默认shell相同的用户:

wKioL1MIYaywus5bAAB4B1630o4553.jpg

1.5 grep实例:

(1)显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行:

正则表达式grep和扩展正则表达式egrep的总结_第3张图片

(2)找出/etc/passwd文件中一位数或两位数:

正则表达式grep和扩展正则表达式egrep的总结_第4张图片

(3)写一个模式,能匹配真正意义上的IP地址;(1.0.0.1--223.255.255.254):

wKiom1MIZ33B_E_zAADoAxxQOlM936.jpg

二、扩展的正则表达式(egrep):

1.1 基本概念:使用扩展正则表达来构建模式,相当于grep -E,为grep的扩充版本, 改良了许多传统grep不能或不便的操作。egrep命令是一个搜索文件获得模式,使用该命令可以任意搜索文件中的字符串和符号,也可以为你搜索一个多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字、一个句子。

1.2 egrep的模式中匹配的元字符:

(1)字符匹配:
           .: 任意单个字符
           []: 指定范围内的任意单个字符
           [^]: 指定范围外的任意单个字符
(2)次数匹配:
           *:匹配其前面的字符任意次;
           ?: 匹配其前面的字符0或1次;
           +: 匹配其前面的字符至少1次
           {m}: 匹配其前面的字符m次;
           {m,n}: 至少m次,至多n次
           {m,}: 至少m次;
           {0,n}:至多n次;
(3)锚定:
           ^: 锚定行首
           $: 锚定行尾
           \<, \b: 锚定词首
           \>, \b:锚定词尾
(4)分组:
           (): 分组

           |: 或者,在做或者处理的时候只能使用扩展的正则表达式。  例如: abc|bcd :表示  匹配字符串“abc”或字符串“bcd”。

1.3 egrep的实例(由于egrep与grep的命令基本相同,在此只做部分举例):

(1)找出netstat -tan命令执行的结果中以“LISTEN”或“ESTABLISHED”结尾的行:

正则表达式grep和扩展正则表达式egrep的总结_第5张图片

(2)找出ifconfig命令结果中的1到255之间的整数:

正则表达式grep和扩展正则表达式egrep的总结_第6张图片

(3)显示/boot/grub/grub.conf中以至少一个空白字符开头的行:

正则表达式grep和扩展正则表达式egrep的总结_第7张图片


三、对grep和egrep的结论:

grep和egrep是很常见也很常用的命令,它最重要的功能就是进行字符串数据的比较,然后将符合用户需求的字符串显示出来,由于vi、grep、awk、sed等工具都支持正则表达式,对于文本中的字符串的处理相当的方便,所以学好正则表达式对于linux中的文本操作就方便多了。