扩展正则表达式与标准正则表达式的优势在于可以省略一些转义字符
扩展正则表达式的元字符与标准正则表达式的元字符相同
在标准正则表达式的命令中添加一个-E的选项就是扩展正则表达式了。
现在使用相同的需求来演示扩展正则表达式
在/etc/passwd中,不以/bin/bash结尾的行
在/etc/passwd中,选取包含两位或者三位数的行
指定出现次数的{}没有与转义字符合用
在/etc/grub2.cfg中至少以一个空白字符开头的,且后面没有空白字符的行
+号前没有转义字符
yue出现一次或多次的行 在/etc/passwd中
括号和+号都没有加转义字符
在内容中查找一行中有两个love或者like的行
在/etc/passwd中查找以root或者zhengyue开头的行
这个例子中,还需要注意一个问题,在标准正则表达式中,分组是需要在扩展前加转义的,在扩展正则表达式中是不需要加转义的。
下面是练习
找出/proc/meminfo文件中,所有以大写或者小写s开头的行,至少三种实现方式
-i的选项是不区分大小写的功能
上面的例子中,为了匹配括号这两个字符,还是需要在括号前加转义字符,不加转义字符就是分组的意思,在标准的正则表达式中,括号是不需要加转义符的,加了转义符才是分组的意思。
显示一个目录的基名 不要用basename
-o 只显示匹配到的字符串
思路是从右往左找非/的字符,因为如果有$符号,系统grep匹配是从右往左匹配的,如果没有定位符就是全部匹配,如果有^符号就是从左往右匹配
证明
命令的意思是找出第一个非/的字符然后匹配的是e字符
然后非/字符可以有多个
有时候给出的是目录名,那么目录名后面还可以有一个/字符
/\?表示可以有一个/字符或者没有/字符
那么显示一个路径的目录名怎么做呢?
这个命令中,以^(/) 与\1 代表 // 两个字符 echo "/tmp/A/123.file" | grep -o "^(/).*\1"
Linux中目录都是以/开头的 那么目录应该是两个/xxx/之间的内容
显示ifconfig命令中的IP地址
定位/etc/passwd 最左一列的字符串
如果要找bash与用户名相同的用户呢?
上面是个失败的例子,上面命令的作用是只要行尾的字符与行中间某个字符相同就是匹配的。
为了能够找到用户名和bash相同就需要使用单词锚定
而且还必须加上^开始符,不然如果行中间的单词与行尾的单词相同也是可以匹配的。
\
本文转自 yueyue207 51CTO博客,原文链接:http://blog.51cto.com/yueyue207/2050880