美文网首页
16-正则表达式

16-正则表达式

作者: 文娟_狼剩 | 来源:发表于2019-04-17 23:03 被阅读0次
    image.png

    正则表达式含义(Regular Expression RE)

    发明1套符号,不同的符号不同的含义,方便我们在文件中查找/过滤内容

    正则表达式的分类

    基础正则(Basic E)
    扩展正则(Extended RE======ERE)

    通配符与正则的区别

    通配符 正则
    作用 是方便我们进行查找文件 方便我们进行过滤(在文件中找内容)
    支持的命令 Linux下面大部分命令可以支持 是给Linux三剑客或开发语言(Python Go PHP JAVA)使用

    使用正则时的注意事项

    注意中文符号
    给grep和egrep加上颜色(CentOS 7 系统完成;CentOS 6 自己添加别名)

    创建环境:

    cat >>oldboy.txt<<EOF
    >I am oldboy teacher!
    >I teach linux.
    >
    >I like badminton ball ,billiard ball and chinese chess!
    >my blog is http://oldboy.blog.51cto.com
    >our size is http://blog.oldboyedu.com
    >my qq is 49000448
    >
    >not 4900000448.
    >my god ,i am not oldbey,but OLDBOY
    >dfdfdkj343433#@#@#@#$%%%^%&^&&**()
    >god
    >gd
    >EOF
    

    1、基础正则(Basic E)※※※※※

    ^
    以……开头的行,如^m或 ^oldboy

    [root@oldboyedu59 ~]# #在这个文件中找出以ssh开头的行
    [root@oldboyedu59 ~]# grep '^ssh' /etc/services
    ssh             22/tcp                          # The Secure Shell (SSH) Protocol
    ssh             22/udp                          # The Secure Shell (SSH) Protocol
    ssh             22/sctp                 # SSH
    sshell          614/tcp                 # SSLshell
    sshell          614/udp                 #       SSLshell
    ssh-mgmt        17235/tcp               # SSH Tectia Manager
    

    $
    以……结尾的行,如mcat -A 显示出文件中所有隐藏符号,每一行结尾====加上

    [root@oldboyedu59 /oldboy]# grep ' ' oldboy.txt
    I am oldboy teacher!
    I teach linux.
    I like badminton ball ,billiard ball and chinese chess!
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    my qq is 49000448
    not 4900000448.
    my god ,i am not oldbey,but OLDBOY! 
    [root@oldboyedu59 /oldboy]# 
    [root@oldboyedu59 /oldboy]# grep 'm $' oldboy.txt
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    [root@oldboyedu59 /oldboy]# cat -A oldboy.txt
    I am oldboy teacher!$
    I teach linux.$
    $
    I like badminton ball ,billiard ball and chinese chess!$
    my blog is http://oldboy.blog.51cto.com $
    our size is http://blog.oldboyedu.com $
    my qq is 49000448$
    $
    not 4900000448.$
    my god ,i am not oldbey,but OLDBOY! $ 
    

    ^$
    空行
    这一行什么都没有(排除空行)

    [root@oldboyedu59 /oldboy]# grep '^$' oldboy.txt
    
    
    [root@oldboyedu59 /oldboy]# 
    

    .(点)
    任意一个字符
    不会匹配出空行
    grep -o :显示grep每次过滤出什么内容,显示grep的执行过程

    [root@oldboyedu59 /oldboy]# grep -n '.' oldboy.txt
    1:I am oldboy teacher!
    2:I teach linux.
    4:I like badminton ball ,billiard ball and chinese chess!
    5:my blog is http://oldboy.blog.51cto.com 
    6:our size is http://blog.oldboyedu.com 
    7:my qq is 49000448
    9:not 4900000448.
    10:my god ,i am not oldbey,but OLDBOY 
    11:dfdfdkj343433#@#@#@#$%%%^%&^&&**()
    [root@oldboyedu59 /oldboy]# 
    

    \ 转义字符
    去掉符号原有特殊意思

    转移字符系列

    \n 回车
    \t 按tab键
    如:把oldboy.txt回车替换为\t

    [root@oldboyedu59 /oldboy]# tr '\n' '\t'< oldboy.txt
    I am oldboy teacher!    I teach linux.      I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com     our size is http://blog.oldboyedu.com   my qq is 49000448       not 4900000448. my god ,i am not oldbey,but OLDBOY  dfdfdkj343433#@#@#@#$%%%^%&^&&**()  god gd  [root@oldboyedu59 /oldboy]# ‘
    
    echo
        -n
            不输出每行结尾的回车
        -e
            让echo支持转义字符\n\t
            
    [root@oldboyedu59 /oldboy]# echo -e  "oldboy\noldgirl\nalex\nlidao"
    oldboy
    oldgirl
    alex
    lidao
    [root@oldboyedu59 /oldboy]# echo -e  "oldboy\noldgirl\nalex\n\t\t\tlidao"
    oldboy
    oldgirl
    alex
    

    *
    前1个字符连续出现0次或0次以上(连续出现====重复(repetition))

    000
    0000000000
        连续出现的0
    oldboy
        连续出现的字母
    

    .*(点星)
    所有 任意字符

    特点:贪婪性(能匹配多少就匹配多少)
    什么时候会有贪婪性?正则表达式表示所有(.*)或者是连续出现的时候,会产生贪婪

    [root@oldboyedu59 /oldboy]# grep '^.*o' oldboy.txt
    I am oldboy teacher!
    I like badminton ball ,billiard ball and chinese chess!
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    not 4900000448.
    my god ,i am not oldbey,but OLDBOY 
    god
    [root@oldboyedu59 /oldboy]# 
    

    []
    [abc] 相当于1个字符,匹配到a或b或c

    [root@oldboyedu59 /oldboy]# grep  '[a-z]'  oldboy.txt
    I am oldboy teacher!
    I teach linux.
    I like badminton ball ,billiard ball and chinese chess!
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    my qq is 49000448
    not 4900000448.
    my god ,i am not oldbey,but OLDBOY 
    dfdfdkj343433#@#@#@#$%%%^%&^&&**()
    god
    gd
    [root@oldboyedu59 /oldboy]# 
    

    [^]-----排除、取反
    如:[^abc]------不要a或不要b或不要c

    [root@oldboyedu59 /oldboy]# grep  '[^abc]'  oldboy.txt
    I am oldboy teacher!
    I teach linux.
    I like badminton ball ,billiard ball and chinese chess!
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    my qq is 49000448
    not 4900000448.
    my god ,i am not oldbey,but OLDBOY 
    dfdfdkj343433#@#@#@#$%%%^%&^&&**()
    god
    gd
    [root@oldboyedu59 /oldboy]# 
    

    2、扩展正则(Extended RE======ERE)※※※※※

    使用命令egrep====grep -E

    +
    前1个字符连续出现1次或多次

    [root@oldboyedu59 /oldboy]# egrep '0+' oldboy.txt
    my qq is 49000448
    not 4900000448.
    [root@oldboyedu59 /oldboy]# 
    

    |
    或者

    [root@oldboyedu59 /oldboy]# egrep 'oldboy|oldbey' oldboy.txt
    I am oldboy teacher!
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    my god ,i am not oldbey,but OLDBOY! 
    

    ()
    被括起来的内容相当于是1个整体
    sed 用来表示后向引用(反向引用)

    [root@oldboyedu59 /oldboy]# egrep 'oldboy|oldbey' oldboy.txt
    I am oldboy teacher!
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    my god ,i am not oldbey,but OLDBOY! 
    [root@oldboyedu59 /oldboy]# egrep 'oldb(o|e)y' oldboy.txt
    I am oldboy teacher!
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    my god ,i am not oldbey,but OLDBOY! 
    

    {}
    跟连续出现有关的:
    *
    +
    b{m.n} 前个字符连续出现至少m次最多n次(>=m <=n)
    b{m} 前一个字符连续出现m次(==m)
    b{m,} 前1个字符连续至少出现m次(>=m)
    b{,n} 前1个字符连续最多出现n次(<=n)

    ?
    前1个字符出现0次或1次

    [root@oldboyedu59 /oldboy]# egrep 'go?d' oldboy.txt
    my god ,i am not oldbey,but OLDBOY 
    god
    gd
    [root@oldboyedu59 /oldboy]# 
    

    练习题:

    显示以m或n或o开头的行
    以m或n或点结尾的行
    显示以m或n或o开头的 并且 以m或n或点结尾的行
    
    #显示以m或n或o开头的行
    [root@oldboyedu59 /oldboy]# 
    [root@oldboyedu59 /oldboy]# grep '^[mno]' oldboy.txt 
    my blog is http://oldboy.blog.51cto.com 
    our size is http://blog.oldboyedu.com 
    my qq is 49000448
    not 4900000448.
    my god ,i am not oldbey,but OLDBOY! 
    
    #以m或n或点结尾的行
    [root@oldboyedu59 /oldboy]# 
    [root@oldboyedu59 /oldboy]# grep '[mn.]$' oldboy.txt
    I teach linux.
    not 4900000448.
    
    #显示以m或n或o开头的 并且 以m或n或点结尾的行
    [root@oldboyedu59 /oldboy]# grep '^[mno].*[mn.]$' oldboy.txt 
    not 4900000448.
    
    id.txt
    金 211324198705244720
    万 500224197105168312
    任 1231231231oldboy
    任 3oldboy
    任 lidao97303136098
    任 alex2197303136098
    任 350182197303oldgir
    吕 211282199209113038
    孔 150000198309176071
    邹 371001197412221284
    贺 130185200011215926
    杜 362522198711278101
    向 14052219961008852X
    取出文件中正确的身份证号码的行
    
    [root@oldboyedu59 /oldboy]# egrep '[0-9X]{18}' id.txt
    [root@oldboyedu59 /oldboy]# egrep '[0-9]{17}[0-9X]$' id.txt
    

    相关文章

      网友评论

          本文标题:16-正则表达式

          本文链接:https://www.haomeiwen.com/subject/pvcnwqtx.html