正则表达式grep和扩展正则表达式egrep的总结

前端之家收集整理的这篇文章主要介绍了正则表达式grep和扩展正则表达式egrep的总结前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、正则表达式(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开头,然后跟着任意一个小写字母的字符串的行:

wKiom1MIGyGjQpNKAADA9LsJpTA288.jpg

(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次:

例如:

wKioL1MIUuiAeCvbAABH8wCPSDU736.jpg

(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)\<char或\bchar: 锚定词首。(char表示由任意字符组成的单词)

例如:显示出/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文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行:

wKioL1MIZhexlVfxAAE39V21kUI132.jpg

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

wKioL1MIZoizbKU6AAE1bs7lOyI500.jpg

(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”结尾的行:

wKiom1MIcIuwpI5fAACn27F0jYQ315.jpg

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

wKioL1MIcQ3AO8SfAAE3bAlpWKk118.jpg

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

wKiom1MIcjfwdyJHAAEBaMFhE0w609.jpg


三、对grep和egrep的结论:

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

猜你在找的正则表达式相关文章