linux下正则表达式学习

    xiaoxiao2025-08-05  10

    符号

    意义

    *

    0个或多个在*字符之前的那个普通字符

    .

    匹配任意字符

    ^

    匹配行首,或后面字符的非

    $

    匹配行尾

    []

    匹配字符集合

    \

    转义符,屏蔽一个元字符的特殊意义

    \<\>

    精确匹配符号

    \{n\}

    匹配前面字符出现n  P.43

    \{n,\}

    匹配前面字符至少出现n

    \{n,m\}

    匹配前面字符出现n~m

     

    其本使用方式:  查看包含sd字符的..

    [fanxb]$ grep -E 'sd' regular.log

    sdfdssd

    sdksks sdksleis

    23423490 ssdlasdw

    92323sdksel lsllll99899

    ++~sdkd ^sdklsdl

     

    *号:前面的表达式有有0个或多个。。

     [fanxb]$ cat -n r1.log

         1 accccb

         2 aeeeeeeeeeeeeb

         3 abeeeeeeeeee

         4 aeb

         5 a1b

         6 aaaaab

         7 abbbbbb

         8 a*b

         9 a+b

        10 cccccccccb

        11 eeeb

        12 ssllls

     

    注意, 这里不是表示a 和 b 之间有多个, 而是表示*号前面的a可以有0或者多个

    所以ccccccb, eeeb这样的行也是可以出来的。

     

    注意这和linux 通配符的区别。

     

     

    [fanxb]$grep-En 'a*b' r1.log

    1:accccb

    2:aeeeeeeeeeeeeb

    3:abeeeeeeeeee

    4:aeb

    5:a1b

    6:aaaaab

    7:abbbbbb

    8:a*b

    9:a+b

    10:cccccccccb

    11:eeeb

     

     

    使用 + 号, 就表示a一定要1个或者多个, 所以ccccccb和eeeb不会出来了。

    [fanxb]$ grep -En 'a+b' r1.log

    abeeeeeeeeee

    aaaaab

    abbbbbb

     

    如果我要匹配的不是单个字符, 而是一个字符串怎么办呢.

    使用( ) 符号

    [fanxb]$cat -nr2.log

         1 abcabcabcabcdsklslls

         2 adcsssabc111abc111

         3 abc1abc2abc3abc4abc5abc6abc7abc8

         4 abc1abc2abc3abc4abc5

         5 abc1abc2abc3abc4abc5abc6abc7

         6 abc1abc2abc3abc4abc5abc6abc7abc8abc9abc11

         7

         8 abc1abc2

         9 abc1abc2abc3

        10 ab c a bc a

     

    使用(abc)*,表示匹配0或者多个 ‘abc’, 所以所有的行都出来了, 包括空行

    [fanxb]$grep-En '(abc)*' r2.log

    1:abcabcabcabcdsklslls

    2:adcsssabc111abc111

    3:abc1abc2abc3abc4abc5abc6abc7abc8

    4:abc1abc2abc3abc4abc5

    5:abc1abc2abc3abc4abc5abc6abc7

    6:abc1abc2abc3abc4abc5abc6abc7abc8abc9abc11

    7:

    8:abc1abc2

    9:abc1abc2abc3

    10:ab c a bc a

     

     

    使用加号就不一样了, 比如是1次或者多次

     

    [fanxb]$grep-En '(abc)+' r2.log

    1:abcabcabcabcdsklslls

    2:adcsssabc111abc111

    3:abc1abc2abc3abc4abc5abc6abc7abc8

    4:abc1abc2abc3abc4abc5

    5:abc1abc2abc3abc4abc5abc6abc7

    6:abc1abc2abc3abc4abc5abc6abc7abc8abc9abc11

    8:abc1abc2

    9:abc1abc2abc3

     

    ?问号呢, 表示0次或者1次,, 如果这里使用的话, 当然所有行都要出来。

    如果说我们想指定具体的次数呢 , 那么使用方括号 { }

     

    注意使用{ } 是表示前面表达式的连续次数,  所以abc1abc2abc3的没有出来

    返回连续3个 abc的行, (因为只要满足连续3个abc, 就返回,所以 4,5,6,7的也返回了,并不是大于3个的意思)

     

    [fanxb]$morer3.log

    abc 1

    abcabc 2

    abcabcabc 3

    abcabcabcabc 4

    abcabcabcabcabc5

    abcabcabcabcabcabc6

    abcabcabcabcabcabcabc7

    abc1abc2abc3

     

    [fanxb]$grep-En '(abc){3}' r3.log

    3:abcabcabc 3

    4:abcabcabcabc4

    5:abcabcabcabcabc5

    6:abcabcabcabcabcabc6

    7:abcabcabcabcabcabcabc7

     

     

    返回连续3到5个abc的行,, 这还是返回所有行, 看来没什么具体用啊。

    [fanxb]$grep-En '(abc){3,5}' r3.log

    3:abcabcabc 3

    4:abcabcabcabc4

    5:abcabcabcabcabc5

    6:abcabcabcabcabcabc6

    7:abcabcabcabcabcabcabc7

     

     

    返回连续3个abc及以上的, 还是一个样..3,4,5,6,7都出来了。

     

    [fanxb]$grep-En '(abc){3,}' r3.log

    3:abcabcabc 3

    4:abcabcabcabc4

    5:abcabcabcabcabc5

    6:abcabcabcabcabcabc6

    7:abcabcabcabcabcabcabc7

     

     

    ^ 和 $ 符号

     

    如果要查找以什么开头的呢:

    [fanxb]$cat -nr4.log

         1  ab c d

         2  ba c e

         3  ef d h

     

    以a开头的…

    [fanxb]$grep-En '^a' r4.log

    1:a b c d

     

    以b结尾的

    [fanxb]$grep-En 'e$' r4.log

    2:b a c e

     

     

     

    方括号:

     

    方括号表示匹配其中任意的字符串:

     

    [fanxb]$cat -nr5.log

         1 asdkweols

         2 blsiels

         3 cdkdieos

         4 edieowls

         5 fieoslsi

         6 1die

         7 2lsiels

         8 3lsiels

         9 4eisol

     

    匹配以abce开头的..

    [fanxb]$grep-En '^[abce]' r5.log

    1:asdkweols

    2:blsiels

    3:cdkdieos

    4:edieowls

     

    也可以使用 ~ 符号.

    [fanxb]$grep-En '^[a~c]' r5.log

    1:asdkweols

    3:cdkdieos

     

    查看以数字开头的,,使用2到4开头

    [fanxb]$grep-En '^[2~4]' r5.log

    7:2lsiels

    9:4eisol

     

    也可以使用 | 符号, 表示或者,, 下面的例子表示以a和1开头的..

     

    [fanxb]$grep-En '^[a|1]' r5.log

    1:asdkweols

    6:1die

     

     

     

    转义字符: \

    \可以改变正则表达式中关键字符的含义, 而是作为普通字符处理。

     

     

    [padba@cnsh230234fanxb]$ cat -n r6.log

         1 sdk*eee

         2 ssd+slie

     

    [padba@cnsh230234fanxb]$ grep -En '\*' r6.log

    1:sdk*eee

     

    字符类

     

     

    字符类

    说明

    [[:alpha:]]

    小写及大写字母,等价于[a-zA-Z]

    [[:alnum:]]

    小写和大写字母及数字,等价于[a-zA-Z0-9]

    [[:cntrl:]]

    控制字符,如制表符(Tab)、换行符或反斜线

    [[:digit:]]

    数字0~9,等价于[0-9]

    [[:graph:]]

    ASCII码从33~126之间的可打印字符

    [[:lower:]]

    小写字母,等价于[a-z]

    [[:punct:]]

    标点符号,包括问号、句号、逗号、冒号、分号、单引号、英文的重音符或中文的间隔号(`)、!、@、#、%、^、&、*、左右括号、左右中括号、左右大括号、正斜杠(/)、-、_

    [[:upper:]]

    大写字母,等价于[A-Z]

    [[:space:]]

    空白字符,包括空格、水平制表符、垂直制表符、换行、换页、回车

    [[:xdigit:]]

    十六进制字符,等价于[a-fA-F0-9]

    注:中括号仅表示匹配指定字符集中的一个字符。

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1301442.html
    最新回复(0)