linux下正则表达式学习

来源:互联网 发布:软件开发规章制度 编辑:程序博客网 时间:2024/05/21 21:49


符号

意义

*

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]

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

 

 

0 0