linux当中的正则/扩展表达式(grep篇)
正则表达式在linux当中我们去使用shell脚本的时候经常会用到正则表达式,所以整理一些我们会用到的表达式,以便提升shell脚本能力
一、正则表达式(1) 通过grep命令实践正则表达式 比如我们去过滤带有bbb字段的行,直接可以通过grep "xx" file去获取到
比如去过滤出以aaa开头的行,我们就需要使用^去匹配了,^表示固定行首 引号加不加都可以
^是匹配行首,而$是匹配行尾,可以试一下,引号也可以不加
比如匹配一个单词,直接可以使用^xx$也就是匹配行首与行尾,grep -n 顺便输出行号,--color颜色
那么^$是空行的意思,匹配空行,在第四行输出一个空格,使用^$也能匹配到
在grep中去匹配一个词的词首或者词尾
也可以固定词首与词尾
除了<固定词首还可以使用b也可以规定词首 除了>固定词尾还可以使用b也可以固定词尾
这个b还有一个兄弟B,这个属于是匹配“非单词边界的" 可以看出匹配第一个bb的时候是除了bb开头之外的词首都匹配到了 下面的匹配除了匹配到bbb开头的词首其他的都去匹配
小结: ^:表示固定行首,词字符后面任意内容必须出现在行首,才能匹配 $:表示固定行尾,词字符前面的任意内容必须出现在行尾,才能匹配 ^$:表示匹配空行,这里所描述的空行表示‘回车’,而空格或tab,等都不能算作此处所描述的空行 ^abc$:表示abc独占一行时,会被匹配到 <或者b:匹配单词边界,表示固定词首,其后面的字符必须作为单词首部出现 >或者b:匹配单词边界,表示固定词尾,其前面的字符必须作为单词尾部出现 B:匹配非单词边界,与b相反
二、正则表达式(2) 找出文本中有哪几行包含两个连续的字母image 比如找出yaml文件中有哪些以image开头的单词
如果一个文本中有很多的单词,但是只想去匹配单词中相同的字段的含有两个连续的
** 匹配次数的正则符号* , 这个我们经常会用到,匹配任意字符的时候 表示匹配任意长度的任意字符 但是在正则表达式中,表示之前的字符连续出现任意次数(包括0次) 比如匹配a*p也就是a可以出现任意次,但是后面必须有p跟着
匹配o*也就是o之后的任意字符
*在通配符中*表示任意长度字符,在正则表达式中而用.来匹配
正则表达式中的.代表后任意一个单个字符,..就是任意两个字符都会匹配到
三、正则表达式(3)常用符号 [[:alpha:]]是匹配所有任意字母带字母的
前面加个a也就是一个带字母的,默认
也就是匹配a后面三个带字母的
匹配a后面2个带字母的
比如三个字符都必须是小写的话 可以使用[[:lower:]] 表示任意小写字母
** 也可以使用表示任意大写字母**
常用符号 [[:alpha:]] 表示任意大小写字母 [[:lower:]] 表示任意小写字母 [[:upper:]] 表示任意大写字母 [[:digit:]] 表示0-9之间的任意单个数字(包括0和9) [[:alnum:]] 表示任意数字或字母 [[:space:]] 表示任意空白字符,包括空格,tab健 [[:punct:]] 表示任意标点符号
除了[[:lower:]]可以代表小写字母,另外一个”[a-z]"也可以表示任意一个小写字母,[[:lower:]]和[a-z]是一样的
同理大写[A-Z]和[[:upper:]]也是一样的
** 使用两种方法来过滤出a字母之后2个的字符 [[:lower:]]小写 [[:upper:]] 大写**
另外还有一个任意字符也就是[[:alpha:]]它和[a-zA-Z]意思一样
** 同理[0-9]和[[:digit:]]等效,都表示0-9之间任意单个数字**
** 这个中间的[a-z]也就是所有的小写字母,也可以匹配相关字符**
也可以匹配特殊字符,[ ]表示匹配指定范围内的任意单个字符
过滤除了这些符号之外的字符
使用[^a-z]排除这个以外的字符
同理 [^a-z]表示非小写字母的单个字符可以被匹配到 [^A-Z]表示非大写字母的单个字符可以被匹配到 [^a-zA-Z]表示非字母的单个字符可以被匹配到,比如数字或符号 [^a-zA-Z0-9]表示非字母、非数字的单个字符可以被匹配到,比如符号
前面试到[a-z]和[[:lower:]]等效那么在^中也是等效的
也就是[^0-9]和[^[:digit:]]等效 [^a-z]和[^[:lower:]等效 [^A-Z]和[^[:upper:]]等效 [^a-zA-Z]和[^[:alpha:]等效 [^a-zA-Z0-9]和[^[:alnum:]等效
除了[0-9], [[:digit:]]可以表示数字,而且还可以使用d来表示数字
** 显示任意单个非数字字符**
d表示任意单个0-9的数字 D表示任意单个非数字字符 t表示匹配单个横向制表符(相当于一个tab健) s表示匹配单个空白字符,包括空格,tab制表符等 S表示匹配单个非空白字符
四、正则表达式 转义符
常用符号"",转义符 之前我们用到了.正则代表匹配后面任意字符,但是如果这个文本中就有这个点,直接匹配的话,也会匹配到其他的,这里我们就需要使用转义符来匹配
如果想匹配反斜杠本身的话 可以使用''单引号来进行匹配,''匹配一个
五、正则表达式小结
#################常用符号################# . 表示任意单个字符。
表示前面的字符连续出现任意次,包括0次。 .* 表示任意长度的任意字符,与通配符中的*的意思相同。 表示转义符,当与正则表达式中的符号结合时表示符号本身。 [ ]表示匹配指定范围内的任意单个字符。 [^ ]表示匹配指定范围外的任意单个字符。 #################单个字符匹配相关################# [[:alpha:]] 表示任意大小写字母。 [[:lower:]] 表示任意小写字母。 [[:upper:]] 表示任意大写字母。 [[:digit:]] 表示0到9之间的任意单个数字(包括0和9)。 [[:alnum:]] 表示任意数字或字母。 [[:space:]] 表示任意空白字符,包括"空格"、"tab键"等。 [[:punct:]] 表示任意标点符号。 [^[:alpha:]] 表示单个非字母字符。 [^[:lower:]] 表示单个非小写字母字符。 [^[:upper:]] 表示单个非大写字母字符。 [^[:digit:]] 表示单个非数字字符。 [^[:alnum:]] 表示单个非数字非字母字符。 [^[:space:]] 表示单个非空白字符。 [^[:punct:]] 表示单个非标点符号字符。 [0-9]与[[:digit:]]等效。 [a-z]与[[:lower:]]等效。 [A-Z]与[[:upper:]]等效。 [a-zA-Z]与[[:alpha:]]等效。 [a-zA-Z0-9]与[[:alnum:]]等效。 [^0-9]与[^[:digit:]]等效。 [^a-z]与[^[:lower:]]等效。 [^A-Z]与[^[:upper:]]等效 [^a-zA-Z]与[^[:alpha:]]等效 [^a-zA-Z0-9]与[^[:alnum:]]等效 #简短格式并非所有正则表达式解析器都可以识别。 d 表示任意单个0到9的数字。 D 表示任意单个非数字字符。 t 表示匹配单个横向制表符(相当于一个tab键)。 s表示匹配单个空白字符,包括"空格","tab制表符"等。 S表示匹配单个非空白字符。
#################次数匹配相关################# ? 表示匹配其前面的字符0或1次 + 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。 {n} 表示前面的字符连续出现n次,将会被匹配到。 {x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。 {,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。 {n,}表示之前的字符连续出现至少n次,才会被匹配到。
#################位置边界匹配相关################# ^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。 $:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。 ^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。 ^abc$:表示abc独占一行时,会被匹配到。 <或者b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。 >或者b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。 B:匹配非单词边界,与b正好相反。
#################分组与后向引用################# ( ) 表示分组,我们可以将其中的内容当做一个整体,分组可以嵌套。 (ab) 表示将ab当做一个整体去处理。 1 表示引用整个表达式中第1个分组中的正则匹配到的结果。 2 表示引用整个表达式中第2个分组中的正则匹配到的结果。
这里意思<1992,b1992都是固定词首,[[:digit:]]和[0-9]都可以表示数字,{4}后面4个的字母结尾>,b都是固定词尾
六、扩展正则表达式
不管是在基本正则表达式中还是扩展正则表达式中,有的通用的符号所表达的意思是相同的 . 表示任意单个字符。
表示前面的字符连续出现任意次,包括0次。 .* 表示任意长度的任意字符,与通配符中的*的意思相同。 表示转义符,当与正则表达式中的符号结合时表示符号本身。 [ ]表示匹配指定范围内的任意单个字符。 [^ ]表示匹配指定范围外的任意单个字符。 [[:alpha:]] 表示任意大小写字母。 [[:lower:]] 表示任意小写字母。 [[:upper:]] 表示任意大写字母。 [[:digit:]] 表示0到9之间的任意单个数字(包括0和9)。 [[:alnum:]] 表示任意数字或字母。 [[:space:]] 表示任意空白字符,包括"空格"、"tab键"等。 [[:punct:]] 表示任意标点符号。 [^[:alpha:]] 表示单个非字母字符。 [^[:lower:]] 表示单个非小写字母字符。 [^[:upper:]] 表示单个非大写字母字符。 [^[:digit:]] 表示单个非数字字符。 [^[:alnum:]] 表示单个非数字非字母字符。 [^[:space:]] 表示单个非空白字符。 [^[:punct:]] 表示单个非标点符号字符。 [0-9]与[[:digit:]]等效。 [a-z]与[[:lower:]]等效。 [A-Z]与[[:upper:]]等效。 [a-zA-Z]与[[:alpha:]]等效。 [a-zA-Z0-9]与[[:alnum:]]等效。 [^0-9]与[^[:digit:]]等效。 [^a-z]与[^[:lower:]]等效。 [^A-Z]与[^[:upper:]]等效 [^a-zA-Z]与[^[:alpha:]]等效 [^a-zA-Z0-9]与[^[:alnum:]]等效
^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。 $:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。 ^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。 ^abc$:表示abc独占一行时,会被匹配到。 <或者b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。 >或者b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。 B:匹配非单词边界,与b正好相反。
grep命令默认只支持基本正则表达式,如果想让grep支持扩展正则表达式,则需要使用-E选项,不过这些70%都是通用的符号,查看效果
另外的30%的与基本正则表达式相比,稍微不同一些,不过看起来比正则还要好理解 在正则表达式中{n}表示前面的字符连续出现n次,将会被匹配到 在扩展正则表达式中,{n}表示前面的字符连续出现n次,将会匹配到
在基本正则表达式中,( )表示分组,(ab)表示将ab当作一个整体去处理 在扩展正则表达式中,( )表示分组,(ab)表示将ab当作一个整体去处理
在扩展正则表达式中: ()表示分组 (ab) 表示将ab当作一个整体去处理 1 表示引用整个表达式中第一个分组的正则匹配到的结果 2 表示引用整个表达式中第二个分组的正则匹配到的结果 ? 表示匹配其前面的字符0或1次
表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶 {n} 表示前面的字符连续出现n次,将会匹配到 {x,y}表示之前的字符至少连续出现x次,最多连续出现y次,都能匹配到 {,n} 表示之前的字符连续出现至多n次,最少0次,都会匹配到 {n,}表示之前的字符连续出现至少n次,才会匹配到 在扩展表达式中,还有一个比较常用的符号,是基本正则表达式中没有的,它就是“|”
它的意思是表示或
找出以.net结尾的行,xxx$以什么为结尾
比如找出以com,net一样结尾的行就可以使用"|",可以使用egrep或者grep -E,()表示将括号内的内容看作一个整体,
也可以这么写,不过没有(com|net)$精确,$这个是以什么结尾
常用扩展表达式小结 常用符号 . 表示任意单个字符。
表示前面的字符连续出现任意次,包括0次。 .* 表示任意长度的任意字符,与通配符中的*的意思相同。 表示转义符,当与正则表达式中的符号结合时表示符号本身。 | 表示"或者"之意 [ ]表示匹配指定范围内的任意单个字符。 [^ ]表示匹配指定范围外的任意单个字符。 单个字符匹配相关 [[:alpha:]] 表示任意大小写字母。 [[:lower:]] 表示任意小写字母。 [[:upper:]] 表示任意大写字母。 [[:digit:]] 表示0到9之间的任意单个数字(包括0和9)。 [[:alnum:]] 表示任意数字或字母。 [[:space:]] 表示任意空白字符,包括"空格"、"tab键"等。 [[:punct:]] 表示任意标点符号。 [^[:alpha:]] 表示单个非字母字符。 [^[:lower:]] 表示单个非小写字母字符。 [^[:upper:]] 表示单个非大写字母字符。 [^[:digit:]] 表示单个非数字字符。 [^[:alnum:]] 表示单个非数字非字母字符。 [^[:space:]] 表示单个非空白字符。 [^[:punct:]] 表示单个非标点符号字符。 [0-9]与[[:digit:]]等效。 [a-z]与[[:lower:]]等效。 [A-Z]与[[:upper:]]等效。 [a-zA-Z]与[[:alpha:]]等效。 [a-zA-Z0-9]与[[:alnum:]]等效。 [^0-9]与[^[:digit:]]等效。 [^a-z]与[^[:lower:]]等效。 [^A-Z]与[^[:upper:]]等效 [^a-zA-Z]与[^[:alpha:]]等效 [^a-zA-Z0-9]与[^[:alnum:]]等效
次数匹配相关 ? 表示匹配其前面的字符0或1次
表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。 {n} 表示前面的字符连续出现n次,将会被匹配到。 {x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。 {,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。 {n,}表示之前的字符连续出现至少n次,才会被匹配到。 位置边界匹配相关 ^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。 $:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。 ^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。 ^abc$:表示abc独占一行时,会被匹配到。 <或者b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。 >或者b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。 B:匹配非单词边界,与b正好相反。
分组与后向引用 ( ) 表示分组,我们可以将其中的内容当做一个整体,分组可以嵌套。 (ab) 表示将ab当做一个整体去处理。 1 表示引用整个表达式中第1个分组中的正则匹配到的结果。 2 表示引用整个表达式中第2个分组中的正则匹配到的结果。