首页 > 代码库 > Linux正则表达式

Linux正则表达式

正则表达式

1、什么是正则表达式

1.1、正则表达式就是为了处理大量的文件文本字符串而定义的一套规则和方法

1.2、通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串

1.3Linux正则表达式一般以行为单位处理

简单说:

  • 正则表达式就是为了处理大量的文本文件,字符串而定义的一套规则和方法

  • 以行为单位,一次处理一行

2、为何使用正则表达式:

  • Linux运维工作,大量过滤日志工作   化繁为简

  • 简单,高效,易用

  • 正则表达式高级工具    Linux三剑客都支持

注意:

正则表达式用来找:文件内容   文本  字符串   三剑客都支持

通配符用来找文件名,文件      普通命令都支持

3BREERE的区别仅仅是元字符的不同:

  • BRE(基础正则表达式)只承认的元字符有 ^ $  .  [ ]  *其它字符识别为普通字符。

  • ERE(扩展正则表达式)则添加了()  {}  +  |

  • 只有在用反斜杠“\”进行转义的情况下,字符()  { }  才会在BRE被当做元字符处理,而在ERE中,任何元字符号前面加上反斜杠反而会使其被当做普通字符来处理

4、基础正则表达式(BRE

符号

描述

^ 尖角号

查找以什么开头的文件

例子:

grep "^r" text.txt
 
root:x:0:0:root:/root:/bin/bash

表示以r开头行

$

查找以什么结尾的文件

例子:

grep "h$" text.txt
 
root:x:0:0:root:/root:/bin/bash

表示以h结尾

^$

取空行

例子:

grep "^$" text.txt     text.txt的空行

text.txt文件中的空行

\

转义符,用来屏蔽一个特殊字符的特殊含义  失去了一个字符的本身含义

例子:

grep "\!$" text.txt

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin!

取以!号结尾的行,不加转义符不行而不是取反

\n   匹配一个换行符

\r   匹配回车

\t   匹配一个横向制表符  tab

[abc]

匹配[abc]内字符,可以是一个单字符,也可以是字符序列。可以使用 - 表示[]内字符序列范围,如用[1-5]代替[12345] 

[abc]表示取中括号内的a或者b或者c,而不是abc整体

例子:

grep "[1-3]" text.txt
 234
 531
 342342

查找包含1-3的行

[^1-3]

不包含^后的任意字符,123。表示取反

例子:

[root@oldboyedu]# grep ‘[^a-z]‘ file.txt  
 
iamisoldboyoldgirlnginxlinux OLDBOY
 
234543
 
34r3       找出不包含a-z的行,黑色为过滤掉的

.

“.”匹配且只能匹配任意一个字符(不匹配空行

例子:

grep "5.1" text.txt

531

表示匹配51中间任意一个字符

grep "23." text.txt

234

342342

匹配23后面任意一个字符

[root@oldboyedu]# grep "." file1.txt

fgsdgsdfdsmldsmgdls,,,,;sdkgsdwww.qq.comgel

ewgmewlgmewgwelgewww.qq.com

gsgewgewgeomomodsgmegipweigtepvsnvdvd  

dfjwwewww.qq.com

rewrwero39r309,.;l‘121‘l‘..www.qq.com

erjeowew.emglwewetwewww.qq.com

35325325230www.qq.com

“.”匹配任意一个字符,所以匹配到了全部并且打印出来了,

*

匹配0次或多次      重复前一个字符0多次的字符

重复、连续0的时候,表示什么也没有(空),匹配出文件所有内容

例如:

grep "333*" text.txt

2333333445565

5666633

注意:*号与不加*号的区别

例子:加*

[root@oldboyedu ]#  grep -o "3*" text.txt

3

333333

333

3333

33

注意:*号表示连续匹配前一个字符0次到多次,*号有个贪婪性,它会尽可能多的匹配

例子:不加*

[root@oldboyedu]#  grep -o "3" text.txt

3

3

3

3

3

3

3

3

3

注意:不加*号表示只能一个一个的匹配,不会连续的匹配

正则符号的贪婪性

正则中的*号和+号会有个贪婪性,它们会尽可能多的来匹配文件中的内容,匹配的越多越好,直到没有匹配的内容为止

例子:

[root@oldboyedu]# grep -o  "3*" text.txt

3

3

3

3

3

333333

333

3333

33

[root@oldboyedu]# egrep -o  "3+" text.txt  +号属于扩展正则中的符号

3

3

3

3

3

333333

333

3333

33

+匹配前一个连续的字符1次到多次

基础正则的命令(grep)如何支持高级正则(扩展正则)

a\{m,n\}

重复前面一个字符mn次,如果用egrepsed –r可去掉斜线

重复前面一个字符m次到n

例子:

grep "6\{1,2\}"  /oldboy/text.txt
 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown!
 
23333..33,445565
 
5666.6,33         匹配6一次或两次,最多两次

例子2

egrep --color=auto  "3{1,3}" /oldboy/text.txt

23333..33,445565
 
5666.6,33         匹配3一次或三次,最多三次

例子:

[root@oldboyedu]#  egrep --color=auto -o "3{1,3}" /oldboy/text.txt

3

3

3

3

3

333

333

333

333

匹配3最少1次,最多三次

a\{m,\}

重复前面字符至少m次,如果用egrepsed r可去掉斜线

例子:

[root@oldboyedu]# grep  "6\{2,\}" text.txt

5666.6,33

匹配数字6至少两次

a\{m\}

重复前面字符m次,如果用egrepsed r可去掉斜线

例子:

[root@oldboyedu]# egrep --color=auto  "6{3}" text.txt

5666.6,33

只匹配数字6三次

a\{,m\}

重复前面的字符最多m次,如果用egrepsed r可去掉斜线

例子:

[root@oldboyedu]# grep  "6\{,3\}" text.txt

23333..33,445565

5666.6,33

匹配数字6最多3

4.1实例:

查找text.txt文件中以u开头到l的匹配行

解答:

[root@oldboyedu]# grep "^u.*l"text.txt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

5、扩展正则表达式(ERE

符号

描述

+

匹配1次或多次连续的字符

例子:

egrep -o "[a-z]+" text.txt

root

x

root

root

bin

bash

bin

取出text.txt文件中所有的单词

例子:

[root@oldboyedu]# egrep -o  "6+" text.txt

6

6

6666

|

或者,同时过滤多个字符

例子:

egrep "is|am" my.txt
 
I am oldboy,myqq is 31333741
 
egrep -o "is|am" my.txt
 
am
 
is

[root@oldboyedu]# egrep -o "am|is" my.txt

am

is

-o只显示匹配到的内容
 
egrep "1521|3306" /etc/services
 
mysql            3306/tcp                 # MySQL
 
mysql            3306/udp                 # MySQL
 
ncube-lm         1521/tcp                # nCube  License Manager
 
ncube-lm         1521/udp                # nCube  License Manager

例子:

[root@oldboyedu]# dumpe2fs  /dev/sda3|egrep -i "inode  size|block size"

dumpe2fs 1.41.12 (17-May-2010)

Block size:           4096

Inode size:           256

例子:

[root@oldboyedu]# dumpe2fs  /dev/sda3|egrep -i "inode  count|^block count"

dumpe2fs 1.41.12 (17-May-2010)

Inode count:              462384

Block count:              1849088

()

小括号的中的内容为一个整体

例如:

[root@oldboyedu]# egrep  "oldb(o|e)y" oldboy.sh

oldboy

oldbey

?

重复前一个字符出现01

6、标识字符集,有如下几种:

[::alnum] : 数字字符

[:digit:] : 数字字符

[:punct:] : 标点符号字符

[:alpha:] : 字母字符

[:graph:] : 非空格字符

 [:space:] : 空格字符

[:blank:] : 空格与定位字符

[:lower:] : 小写字母字符

[:upper:] : 大写字母字符

[:cntrl:] : 控制字符

[:print:] : 可显示的字符

[:xdigit:] : 16进制数字


本文出自 “每天一小步” 博客,请务必保留此出处http://fenyuer.blog.51cto.com/11265169/1931773

Linux正则表达式