shell 正则表达式

通配符            意义

  *         匹配任意多个字符(包括零个或一个)
  ?         匹配任意一个字符(不包括零个)
  [characters]     匹配任意一个属于字符集中的字符
  [!characters]    匹配任意一个不是字符集中的字符
  [[:class:]]      匹配任意一个属于指定字符类中的字符
git

  

     字符类         意义正则表达式

  [:alnum:]      匹配任意一个字母或数字
  [:alpha:]       匹配任意一个字母
  [:digit:]        匹配任意一个数字
  [:lower:]       匹配任意一个小写字母
  [:upper]       匹配任意一个大写字母
ide



基础正则表达式符号

符号 描述 实例
. 表明单个字符(必须存在)

a..bspa

能够表示acdb字符串

      aaab 、abbbbit

但不能够表示acb、ab、aba等table

*

要和通配符区分开,匹配 * 前面一个字符的0个或多个ast

*后面的字符必定要在*前面字符的后面class

另外*先后字符必须相邻不然匹配不到test

a*b

能够表示ab、aab、b、abababab

但不能够表示acb、ba等

acb只会匹配到b,也就是视为b前面有0个a

ba也只会匹配到b,一样视为b前面有0个a

^ 匹配 ^ 后面字符串开头

 输入:echo  -e  abcd\accc | grep "^ab"

输出:abcd

$  匹配 $ 前面字符串结尾  

 输入:echo  -e  abcd\accc | grep "cc$"

输出:accc

 .*  匹配任意个字符(0到多个)

 a.*b

和通配符里面的 * 大体相似

能够表明ab、 acb、 a……b

但不能表明b……a

 []

 表示范围,能够用来进行模糊匹配

经常使用选项为【a-z】 【0-9】

1.  grep【0-9】 text 过滤出含数字的行

2.  grep【a-z】 text 过滤出含小写字母的行

3.  grep 【abc】 text 过滤出含有a,b,c的行(注意这个abc是分别匹配,也就是至关于匹配含有a的行,b的行,c的行,并非字符串abc的行

 {}

{n,m}表示匹配 {} 前面字符的至少n个,最多m个 字符,注意:是连在一块儿的连续字符

还能够为{n,}表示至少有n个

{,m}表示最多有m个

 1.输入echo abbcdfbjk | grep -E "b{1,2}"

输出 abbcdfbjk 

2. 若是 输入 echo abbcdfbjk | grep -E "b{2,}"  #表示至少两个

输出结果为 abbcdfbjk  能够看到只有连在一块儿的两个bb被匹配到,也就是说明了{}里面的数字表示的不是匹配到的个数,而是匹配字符的长度,像这个例子就是要求出现 b 的长度至少是2,因此只有 bb 被匹配到了

3.  输入 grep -E "ac{2,5}b" 匹配a和b之间至少2个最多5个c的行,可是acb要连在一块儿

 【^】  【^a】表示匹配 a 之外的全部字符

 输入  echo  -e abc \ def \ lmn | grep "[^f-z]"

输出  abc  def lmn,只有[a-e]配匹配到

 ^[^]  匹配 ^[^a]中的以a为开头之外的全部行  grep "^[^#]"  /etc/passwd   匹配  /etc/passwd  里面不以#开头的全部行
\<  ;  \>

锚定 单词首部 (尾部)  

表示在匹配在首部(尾部)以空格或特殊字符为分隔的指定字符。若是同时锚定首尾  \<  \>  则表示这个字符的准确匹配,它的先后为特殊字符或空格分隔,不会和任何字符直接链接

注意:必需要加 \ 转义,即便使用扩展正则也要加  \  进行转义

 输入 :echo "hi,rootamroot" | grep "\<root"
输出:hi,rootamroot

输入: echo "hiroot iamroot" | grep "root\>"
输出: hiroot iamroot

 输入: echo "hi,root  iamroot" | grep "\<root\>"
输出:hi,root  iamroot

 ()

 \1  调用前面的参数—第一个分组(也就是括号里的参数)

若是用扩展正则则不须要 \ 来进行转义

 

过滤出一行中有两个相同数字的行

# grep "\([0-9]\).*\1"  /etc/passwd

过滤出行首和行位字母相同的行

# grep "^\([a-z]\).*\1$" /etc/passwd

扩展正则

 扩展正则包含基础正则,并且多出了  +    ?   |    ()四个指令(注意这里的 | 要和管道符分开)   扩展正则不须要像基础正则同样对某些符号进行转义(通常是用 反斜杠  \  来进行)

 


做用:重复一个或者一个以上的前一个字符

示例:执行“egrep -n 'wo+d' test.txt”命令,便可查询"wood" "woood" "woooooood"等字符串

   

做用:零个或者一个的前一个字符

示例:执行“egrep -n 'bes?t' test.txt”命令,便可查询“bet”“best”这两个字符串

   


做用:使用或者(or)的方式找出多个字符

示例:执行“egrep -n 'of|is|on' test.txt”命令便可查询"of"或者"if"或者"on"字符串

   

()  

做用:查找“组”字符串

示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”由于这两个单词的“t”与“st”是重复的,因此将“a”与“e”列于“()”符号当中,并以“|”分隔,便可查询"tast"或者"test"字符串

   

()+  

做用:辨别多个重复的组

示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的 "xyz"字符串的意思

相关文章
相关标签/搜索