正则表达式

基本正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

1、字符匹配

  • .:任意字符
  • []:匹配指定范围内的单个字符
  • [^]:匹配指定范围外的单个字符
  • [:alnum:] 字母和数字
  • [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
  • [:lower:] 小写字母 [:upper:] 大写字母
  • [:blank:] 空白字符(空格和制表符)
  • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
  • [:digit:] 十进制数字 [:xdigit:]十六进制数字
  • [:graph:] 可打印的非空白字符
  • [:print:] 可打印字符
  • [:punct:] 标点符号

2、匹配次数

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

  • *:匹配前边的字符任意次
  • .*:匹配任意字符任意次,表示所有
  • \?:匹配前边字符0或一次,表示前边字符可有可无
  • \{m\}:匹配前边字符m次
  • \{m,n\}:匹配前边字符最少m次,最多n次
  • \{,n\}:匹配前边字符至多n次,\{m,\}:匹配前边字符至少m次

3、位置锚定

  • ^:行首锚定,用于模式的最左侧
  • $:行尾锚定,用于模式的最右侧
  • ^PATTERN$:用于模式匹配整行\<或\b:单词锚定,用于单词模式的左侧
  • ^$:匹配空行
  • ^[[:space:]]*$:匹配空白行
  • \>或\b:单词锚定,用于单词模式的右侧
  • \<PATTERN\>:匹配整个单词
  • \(\) 分组:将多个字符捆绑一起当做一个字符用
    习题
    1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
        # cat /proc/meminfo |grep -i "^s"
        # cat /proc/meminfo |grep "^\(s\|S\)"
    2、显示/etc/passwd文件中不以/bin/bash结尾的行
        # grep -v "/bin/bash$" /etc/passwd
    3、显示用户rpc默认的shell程序
        # getent passwd rpc |grep -o "/[s]\?bin/.*"
    4、找出/etc/passwd中的两位或三位数
        # getent passwd |grep -o "\b[[:digit:]]\{2,3\}\b"
    5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行
        # cat /etc/grub2.cfg |grep "^[[:space:]]\+" |grep -v "^[[:space:]]*$"
    6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
        # netstat -tan |grep "ESTABLISHED"
    7、显示CentOS7上所有系统用户的用户名和UID
        # getent passwd |cut -d: -f1,3
    8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行
        # getent passwd |grep "^\(\<[[:alnum:]]*\).*/\1$"
    9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
        df |grep "sd[a-z]" |grep -o "[0-9]\{1,3\}%" |grep -o '[[:digit:]]*'

     

    扩展的正则表达式

     正则表达式与扩展正则表达式类似,只是扩展正则表达式表达更加简单。

    正则表达式需要打 \ 转义字符 来表示某些字符的意思,而扩展正则表达式则不需要:

    • \{m} 正则表达式表示至少表示前面的字符m次                      {m}            
    • \? 正则表达式表示前面的字符0或1次                           ?          
    • \+ 正则表达式表示前面的字符至少一次                          +
    • \(\) 正则表达式表示分组                                  ()            
    • \| 正则表达式表示或                                     | 
      练习:
      1
      显示Centos7的/etc/grep2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行 cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]]" 2 找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行 netstat -tan |grep "LISTEN[[:space:]]\+$" 3 显示Centos7上所有系统用户的用户名和UID cat /etc/passwd |cut -d: -f1,3 |grep "\<[0-9]\{1,3\}\>" 4 显示三个用户root,mage,wang的UID和默认的shell cat /etc/passwd |egrep "^(root|yuan|gentoo)\b" | cut -d: -f3,7 5 找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行 cat /etc/rc.d/init.d/functions |egrep "^[_[:alnum:]]+\(\)" 6 使用egrep取出/etc/rc.d/init.d/functions中其基名 echo /etc/tc.d/init.d/functions |egrep -o "[^/]+$" 7 使用egrep取出上面路径的目录名 echo /etc/tc.d/init.d/functions | egrep -o ".*/" 8 统计last命令中以root登录的每个主机IP地址登录次数 last |grep "^root\>" |egrep -o "([[:digit:]]{1,3}.){3}[[:digit:]]{1,3}" |sort |unip -c |sort -nr 9 利用扩展正则表达式分别表示0-910-99100-199200-249250-255 [0-9] [0-9][0-9] 1[0-9]{2} 2[0-4][0-9] 25[0-5]

       

          
       
posted @ 2018-04-14 19:42  琼兔  阅读(225)  评论(0编辑  收藏  举报