码迷,mamicode.com
首页 > 其他好文 > 详细

grep, egrep及相应的正则表达式用法详解

时间:2015-04-03 06:56:09      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:正则表达式


 

1.常见相关概念
  1.globbing: 文件名通配( *, ?, [], [^])
  2.常用的文本处理工具:grep, egrep, sed, awk, vim, nginx
  3.grep(全名:Global search REgular expression and Print out the line.)
  4.文本搜索工具,根据用户指定的文本模式(正则表达元字符以及正常字符组合而成)对目标文件进行逐行搜索,显示能匹配到的行;
  5.正则表达式(REGular EXPression REGEXP):是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能;

   6.基本正则表达式: grep

  7.扩展正则表达式: grep -E, egrep
  8. fgrep: fast, 不支持使用正则表达式


2.正则表达式的相关命令

  1.grep命令
   命令格式:grep [OPTIONS] PATTERN [FILE...]
   过滤条件:以行为独立单位

   模式(pattern):以正则表达式的元字符,以及正常字符组合而成

   --color[=WHEN],其中WHEN=[auto,always,never]
     eg1:#grep --color=auto "root" /etc/passwd
  技术分享
   -o: 只显示被模式匹配到的内容

  技术分享     

  -i: ignore case,不区分字符大小写
  -v: 显示不能够被模式匹配到的行
  -E:使用扩展的正则表达式
  -A #:显示被匹配到的行及下面#行
  -B #:显示被匹配到的行及上面#行
  -C #显示被匹配到的行、上面#行及下面#行


   2. 基本正则表达式元字符:
      1.字符匹配d


      2.次数匹配(期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数)

    技术分享

    3. 位置锚定

   技术分享

    4. 单词锚定:由非特殊字符组成的连续的字符串

   技术分享  


  5. 分组:\(\) 与引用 :\#
   【注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆】

    (保存于内置的变量中,这些变量是\1, \2, ...),因此,还可以被引用)
   \1: 引用,模式中自左而右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;
   \2: 引用 ,模式中自左右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容

        eg1: "\(ab\(cd\)mn\) \1 \2"【表示:(ab(cd))ab(cd)
      eg2:“\(a.b\).*\1" 【表示a.b.*a.b,如:amb hello anb】

      eg3:【 表示"\(l..e\).*\1",找出前面以l..e开头,后面同包含一个l..e的行】

                         He like his lover.

                         He like his liker.

                         She love her lover.

                         She love her liker.

      eg4:【表示:\(.*\)\.mp3.*\1\.wvm,找出中间包含#.mp3,而后又有#.wvm(#与前相同)的行
        play.php?a.mp3?search?a.wmv
                    play.php?where.mp3?hello?when.wmv
                               

    

     相关练习: 
               1、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
                    # grep "^[sS]" /proc/meminfo

      技术分享

      2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
        # grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

        技术分享            技术分享
     
      3、找出/etc/passwd文件中的一位数或两位数;
       # grep -o "\<[0-9]\{1,2\}\>" /etc/passwd

        技术分享            技术分享
      4、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
       # grep "^[[:space:]]\+" /boot/grub/grub.conf

        技术分享             技术分享
      5、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
       #grep "^#[[:space:]]+[[:space:]]+" /etc/rc.d/rc.sysinit

        


    技术分享            技术分享
          
      6、打出netstat -tan命令执行结果中以‘LISTEN’后或跟空白字符结尾的行;
       # netstat -tan | grep "LISTEN[[:space:]]*$"  
 

      技术分享

      【注意:以‘LISTEN’后或跟空白字符结尾,“或”意味着LISTEN后面有空白字符或没有空白字符】

                    技术分享
      7、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
                   # useradd bash

# useradd testbash
# useradd basher
# useradd -s /sbin/nologin nologin

                   # grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

      技术分享

    

                
 2.扩展的正则表达式:
   1.egrep命令

   命令格式:egrep [OPTIONS] PATTERN [FILE...]
   过滤条件:以行为独立单位

   模式(pattern):以正则表达式的元字符,以及正常字符组合而成

   --color[=WHEN],其中WHEN=[auto,always,never]
   -o: 只显示被模式匹配到的内容

                                      

   -i: ignore case,不区分字符大小写
   -v: 显示不能够被模式匹配到的行
   -E:使用扩展的正则表达式
   -A #:显示被匹配到的行及下面#行
   -B #:显示被匹配到的行及上面#行
   -C #显示被匹配到的行、上面#行及下面#行


   2. 基本正则表达式元字符

  1. 字符匹配(与grep用法一样)

   

  2.次数匹配:

     技术分享

 3.位置锚定:


    技术分享

   

        4.分组:(     )  && 引用:\1, \2, ...  &&  或者: a|b【a或者b, 或者两侧的所有内容】

    


 相关练习:

   1、显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式;

    # grep -E "^[sS]" /proc/meminfo    或

    # grep -E "^(s|S)" /proc/meminfo    或

    # egrep -i "^s" /proc/meminfo

   技术分享

 

  2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

   # egrep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

  技术分享

 

  3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;

   # egrep "/bin/bash$" /etc/passwd | cut -d: -f1

   技术分享

 

4、找出/etc/passwd文件中的一位数或两位数;              

 # egrep --color=auto "\<[0-9]{1,2}\>" /etc/passwd      或

 # egrep -o "\<[0-9]{1,2}\>" /etc/passwd     技术分享   技术分享         

     技术分享

               技术分享

   5、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

    # egrep "^#[[:space:]]+[^[:space:]]+" /etc/rc.d/rc.sysinit

      技术分享       技术分享

    

             技术分享

6、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

    # egrep "^([[:alnum:]]+\>).*\1$" /etc/passwd

    技术分享           技术分享

7、显示当前系统上root、fedora或user1用户的默认shell;

      # grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f7     或

     # egrep "^(root|fedora|user1)\>" /etc/passwd |  cut -d: -f7

        技术分享       技术分享

8、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();

        # grep -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions  或

        # egrep  "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions

            技术分享   技术分享

9、使用echo命令输出一个绝对路径,使用grep取出其基名;

  扩展:取出其路径名

    # echo /etc/rc.d/init.d/functions | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1

     技术分享               

                    技术分享                  
   # echo /etc/passwd/rcd/function/s | egrep  -o "[[:alnum:]]+/?$" 

   技术分享                 技术分享

10、找出ifconfig命令结果中的1-255之间数字;

    # ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

    技术分享

本文出自 “Jason” 博客,请务必保留此出处http://10037618.blog.51cto.com/10027618/1627831

grep, egrep及相应的正则表达式用法详解

标签:正则表达式

原文地址:http://10037618.blog.51cto.com/10027618/1627831

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!