LINUX-初学正则表达式

正则表达式

  

简介

      REGEXP:由一类特殊字符及文本字符由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
                   不表示字符字面意义,而表示控制或通配的功能。

      程序支持:grep,sed,awk,vim,less,nginx,varnish等,下面将介绍grep中正则表达式的用法。

      正则表达式分基本正则表达式(BRE)和扩展正则表达式(ERE)

     正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块PCRE(Perl Compatible Regular Expressions)

     元字符分类:字符匹配、匹配次数、位置锚定、分组

 

BRE元字符

      字符匹配:


                  .                              匹配任意单个字符

                 []                            匹配指定范围内的任意单个字符  

                [^]                          匹配指定范围外的任意单个字符


              [:alnum:]                     字母和数字,即a-z,A-Z,0-9


              [:alpha:]                      代表任何英文大小写字符,即a-z,A-Z

              [:lower:]                       小写字母 ,即a-z

              [:upper:]                      大写字母,即A-Z


              [:blank:]                       空白字符(空格和制表符)

              [:space:]                      水平和垂直的空白字符,包括空格键,[tab],CR等


              [:digit:]                        十进制数字  ,即0-9

              [:xdigit:]                       十六进制数字,包括:0-9,A-F,a-f的数字与字符


              [:cntrl:]                         不可打印的控制字符(退格、删除、警铃…)

              [graph:]                        可打印的非空白字符(空格键与[tab]按键外的其他所有按键 

              [:print:]                         任何可以被打印出来的字符

              [:punct:]                       标点符号,即 : “  ‘  ? ! ; :#  $….

 匹配次数:

         用在要指定次数的字符后面,用于指定前面的字符要出现的次数

     


        *          匹配前面的字符任意次,包括0次(贪婪模式:尽可能长的匹配)


       .*          任意长度的任意 。                   例如:a*,可以表示a,aa,aaa,aaaaa,aaaa…a.


       \?          匹配其前面的字符0或1次 。      例如:ab\?c ,表示ac,abc


       \+          匹配其前面的字符至少一次 。   例如:ab\+c  表示abc,abbc,abbbc等。 \+匹配前面一个字符

                                                                                  最少1次,最多任意次,不包括0次。


      \{n\}       匹配前面的字符n次。               例如: ab\{2\}c ,表示在a与c之间有两个b,

                                                                              即abbc


    {m,n}     匹配前面的字符至少m次,至多n次 。  例:ab{1,3} c,表示在a与c之间有1个到3个b,即                                                                                                      abc,abbc,abbbc


      \{,n\}      匹配前面的字符至多n次             例:ab\{,3\}c,表示ac,abc,abbc,abbbc。

                                                                          最多3次,可以包括0次。 


      {m,}     匹配前面的字符至少m次             例:ab{2,}c,表示a与c之间最少有2个b,即                                                                                                               abbc,abbbc,abbbbc,abbb…c


  

      示例:在/app下先创建一些文件,运用BRE中匹配次数,进行简单的操作。如下图



                 LINUX-初学正则表达式 


 

位置锚定:

         定位出现的位置


           ^               行首锚定,用于模式的最左侧           例:^content,匹配行首为content的行    


          $                 行尾锚定,用于模式的最右侧           例:txt$,匹配行末为txt结尾的行;^$匹配空白行


    ^PATTERN$        用于模式匹配整行 ;^$匹配空行;^[[:space:]]*$匹配空白行


      \< 或 \b           词首锚定,用于单词模式的左侧       例:\<th匹配… this…,但不匹配tenth等


       \> 或 \b          词尾锚定;用于单词模式的右侧       例:p\>匹配leap,但不匹配parent等


    \<PATTERN\>     匹配整个单词        例:\bat\b 匹配… at …, 但不匹配 cat 、batch等


      

 下面我们在/etc/passwd文件中,运用BRE位置锚定来过滤查看一些文件的内容。如下图


                    LINUX-初学正则表达式

   从上图中可以看出,^$,^[[:space:]]$只匹配空行;\<bash\>,只匹配带有整个单词bash的行,不匹配包含bash单词的     行,如sbin的行。


分组:

        \(\) 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:\(root\)\+  ;
        分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …; 
       \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符。
            
       后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身 

                      示例:\(root\)*\1

       下面通过一些例子来简单介绍分组的基本用法,还是以/etc/passwd文件为例。如下图:

                

                 LINUX-初学正则表达式

      上图中:第一个组\(daemon\) ,\1表示调用第一个组匹配到的字符,不是模式本身;虽然都是daemon,但是意思不   一样。\2表示调用第二个组匹配到的字符。

                      

                   LINUX-初学正则表达式

或者:\| 
       示例:a\|b: a或b  C\|cat: C或cat   \(C\|c\)at:Cat或cat

     例:在/app下创建a、 b、 act、 bct、 cct、 dct 六个文件,运用正则表达式元字符或者,来进行些简单操作。如下图:

               LINUX-初学正则表达式

扩展正则表达式

  元字符:  
    字符匹配: 
          . 任意单个字符 
         [] 指定范围的字符 
         [^] 不在指定范围的字符
     
    位置锚定: 
           ^  :行首 
           $  :行尾 
       \<, \b :语首
       \>, \b :语尾  
   
    
    次数匹配:
       *:匹配前面字符任意次 
       
       ?: 0或1次 
       +:1次或多次 
     {m}:匹配m次 
    {m,n}:至少m,至多n次

    分组: 
       () 后向引用:\1, \2, …  
   
   或者: a|b: a或b     C|cat: C或cat 
         (C|c)at:Cat或cat

扩展正则表达式与基本正则表达式用法差不多;区别在于反斜杠”\“的不同。基本正则表达式元字符中,次数匹配,分组和或者都加反斜杠”\“;

而扩展正则表达式中,次数匹配,分组和或者都不需要加”\“。具体用法参考基本正则表达式,这里就不举例说明了。  

     

原创文章,作者:shenjialong,如若转载,请注明出处:http://www.178linux.com/77432

(0)
shenjialongshenjialong
上一篇 2017-06-04 11:14
下一篇 2017-06-04 11:59

相关推荐

  • Linux基础命令 -管道密切配合使用 tee

    基础命令和管道密切配合使用  tee     基础命令:tee   tee命令 功能: 把命令1的STDOUT保存在文件名中,然后管道输入给命令2; 补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。 使用场景: 1.保存不同阶段的输出 2.复杂管道的故障排除 3.同时查看和记录…

    Linux干货 2016-08-03
  • M22 wireshark使用方法简介

    wireshark是一款著名的开源抓包软件,它可以抓取网卡的数据包,以供网络管理员分析。 一 安装方法 debain系安装方法: sudo add-apt-repository ppa:wireshark-dev/stable sudo apt update sudo apt install wireshark 启动wireshark: sudo wires…

    2017-03-20
  • 9 grep & egrep & 正则表达式

    grep grep = Global search REgular expression and Print out the line 语法及用途 grep [OPTIONS] PATTERN [FILE…] 根据用户指定的“…

    Linux干货 2016-08-10
  • 文件、目录权限

    批量创建新用户: newusers passwd格式文件 批量创建用户,必须和/etc/passwd下的文件格式一样   下面开始批量创建:   首先准备好一个文件:用vi命令建一个user.txt 如图: 然后用cat user.txt 然后newusers批量创建,cat /etc/passwd查看下: 创建成功 批量修改用…

    Linux干货 2016-08-04
  • Linux网络管理

                          Linux网络管理   本章内容: 网络概念 OSI七层模型 网络设备 TCP/IP IP地址 配置网络 实现网络组 测试网络 网络工具   网络用户应用程序: WEB浏览器(…

    系统运维 2016-09-12
  • 利用nginx实现基于传输层的四层负载均衡

    nginx利用ngx_stream_core_module实现四层的负载均衡服务。作为四层负载均衡nginx和lvs的区别在于: lvs工作于内核层,相对来说效率更高,性能更强; nginx工作于用户空间; lvs不会受到套接字数量的限制; nginx作为四层负载均衡也需要监听套接字来和客户端,后台服务器进行连接,会受到套接字数量限制,不过这个问题可以通过k…

    2017-07-03