正则表达式 grep

一.基础正则表达式的概述


    正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串
    
    
    正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
    
    
    正则表达式的字符串表达方法根据不同的严谨程度与功能分为基础正则表达式与扩展正则表达式
    
    
    在Linux系统中常见文件处理工具中grep与sed支持基础正则表达式,而egrep与awk支持扩展正则表达式
    
二.grep命令的各种用法

查找特定的字符,“-n”表示显示行号、“-i”表示不区分大小写,且符合标准的字符,字体颜色会变为红色,“-v”实现反向查找
[root@localhost ~]# grep -in 'zhangsan' /etc/passwd43:zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash [root@localhost ~]# grep -vn 'nologin' /etc/passwd1:root:x:0:0:root:/root:/bin/bash6:sync:x:5:0:sync:/sbin:/bin/sync7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8:halt:x:7:0:halt:/sbin:/sbin/halt43:zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash[root@localhost ~]#  

利用'[]'来查找集合字符
[root@localhost ~]# grep -n 'sh[iot]rt' a.txt1:short2:shirt3:shtrt[root@localhost ~]# 

"[^ ]" 实现集合字符的反向选择,如下查找“oo”前面不是“r”的字符串,|为且符号
[root@localhost ~]# grep -n '[^r|sh]oo' /etc/passwd5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin39:postfix:x:89:89::/var/spool/postfix:/sbin/nologin[root@localhost ~]# 

不希望“oo”前面出现小写字母和大写字符以及数字,可以执行 “grep -n '[^a-zA-Z0-9]'  a.txt“
[root@localhost ~]# grep -n '[^a-zA-Z0-9]' a.txt7:_oodd 

行首符”^ “,放在[ ]之内表示取反,放在[ ]之外表示行首字符,如查询不以字母开头的行 ‘ ^[^a-z]’
[root@localhost ~]# grep -n '^[^a-z]' a.txt4:12oo127:_oodd[root@localhost ~]# 

定位行尾$ 
//由于小数点在正则表达式中表示别的意思,所以学要用转义符\将特殊意义的字符转化为普通字符[root@localhost ~]# grep -n '\.$' a.txt8:Ab.9:cold.[root@localhost ~]# 

查询空白行时使用,“ grep  -n  '^$'  a.txt”
[root@localhost ~]# grep -n '^$' a.txt10:[root@localhost ~]# 

用“.”查找任意一个字符,"."在正则表达式中的一个元字符,代表任意一个字符
[root@localhost ~]# grep -n 'w..d' a.txt5:wood[root@localhost ~]# grep -n 'w.d' a.txt12:wod[root@localhost ~]# 

“*”代表的是重复零个或者多个前面的单个字符,“o*”表示拥有零个或大于等于一个“o”的字符,因为允许空字符,所以执行”grep -n ‘o*’ a.txt“会将文本中所有内容都输出打印,”oo*“表示第一个o必须存在,第二个o则是零个或多个o;”ooo*“表示第一个和第二个o必须存在,第三o则是零个或多个
[root@localhost ~]# grep -n "ooo*" a.txt4:12oo125:wood6:wooood7:_oodd13:wood14:wooooood15:wooooo

查询以w开头d结尾,中间的字符可有可无的字符串
[root@localhost ~]# grep -n 'w.*d' a.txt5:wood6:wooood12:wod13:wood14:wooooood16:wd

查询任意数字所在行
[root@localhost ~]# grep -n '[0-9][0-9]*' a.txt4:12oo1211:777[root@localhost ~]# 

查找连续字符范围,“{}”可以限制一个范围内的重复的字符串,因为在shell中{}有特殊意义,所以使用“{}“字符时,需要利用转义字符”\",将”{}”字符转换成普通字符
    查询包含两个o字符的行
[root@localhost ~]# grep -n 'o\{2\}' a.txt4:12oo125:wood6:wooood7:_oodd13:wood14:wooooood15:wooooo[root@localhost ~]# 

查询以w开头以d结尾,中间包含2~5个o的字符串;和包含5以上的o字符串
[root@localhost ~]# grep -n 'wo\{2,5\}d' a.txt5:wood6:wooood13:wood[root@localhost ~]# grep -n 'wo\{5,\}d' a.txt14:wooooood[root@localhost ~]# 

三.元字符的总结

^,匹配输入字符串的开始位置。除非在方括号表达式中使用,表示取反。要匹配“^"字符本身,请使用“\^"
    $,匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则“$”也匹配‘\n’或‘\r’。要匹配“$”字符本身,请使用“\$”
    . ,匹配除“\r\n”之外的任何单个字符
    \ ,将下一个字符标记为特殊字符、原义字符、向后引用、八进制转义符。例如,‘n’匹配字符“n”。 ‘\n’匹配换行符。序列‘\\’匹配“\”,而‘\(’则匹配“(”
    * , 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“\*”
    [] ,字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
    [n1,n2],字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身
    {n1},n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个 o
    
    {n,},n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有 o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”
    
    
    {n,m},m 和n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配 m 次
 

发布了44 篇原创文章 · 获赞 10 · 访问量 1016

猜你喜欢

转载自blog.csdn.net/weixin_45725244/article/details/103519445