Linux的正则表达式跟网络上BGP的正则表达式有些不一样的地方,哪里不一样需要自己总结
而且Linux的正则表达式与Linux中的文件名匹配也有些差别,在文件名匹配的文章里我记录了一些不一样的地方。
Linux中正则表达式分两种:1、基本的正则表达式 BRE 2、扩展正则表达式 ERE
第一个与文件名匹配不同的就是任意单个字符 正则表达式的以.(点)表示 文件名匹配是以?(问号)表示
第二个不同就是文件名匹配没有开始和结束符 正则表达式有
正则表达式的元字符
. 点 任意单个字符,包括空格 但是不匹配空字符
. 匹配所有内容
^ 开头标识符 字符前不能有其他字符
- 指定一个匹配范围 下面这个例子就是找到以a,b,c开头的行
匹配出现次数 文件名匹配没这个功能
星号*(只需要是一个星号) 匹配前面字符的任何次数,0次或者多次
+匹配前面字符的1次或多次
?匹配前面字符的0次或1次
匹配字符o 一次或者多次
上面这个例子中需要注意一点,就是+号之前必须加转义符,不然就是下面的结果
上面这个例子注意*号前不需要转义符
还可以指定次数
{m} 指定m次 {m,n} m和n之间 包括m和n {m,}至少m次 {0,n}至多n次
$结束符
而且系统会将匹配的字符加粗显示
词首锚定指定一个单词的首部 比如我想查看root用户的信息
上面会匹配出其他的内容,就算加上^开始符还是有其他内容
需要使用词首和词尾锚定来指定单词
\<\> 这两个字符可以将准确的单词描述出来,这两个字符可以使用\b来表示
显示有2位或者3位数字的行
上面这个例子需要注意的是需要锚定数字的位数2位或者3位,如果不锚定,意思就是包括2个或者3个数字的行 这样4位数的行也会匹配到
至少以一个空白字符开头,且后面都是非空白字符的行
分组有时候并不是想匹配一个字符 而是多个字符
括号要加转义字符
在上面的例子当中 如果我想匹配一行当中有两个like或者两个love的行该如何做呢?
\1代表了第一次配括号匹配到字符串 l..e可以匹配love和like 还有一个要强调的,grep 后面需要匹配的内容最好使用双引号引起来
在grep中还可以使用或这个逻辑运算符
匹配以root或者zhengyue字符串开头的行
上面这个例子中,需要注意的是| 或这个逻辑运算符前面要加转义字符
grep 还有一个选项-v 表示取反,就是不显示匹配到的字符或字符串
表示不以/bin/bash结尾的行
显示匹配以/bin/bash结尾的行,再加一个-v的选项。
本文转自 yueyue207 51CTO博客,原文链接:http://blog.51cto.com/yueyue207/2050843