03.24 正则表达式

来源:互联网 发布:2017mac和iphone铃声 编辑:程序博客网 时间:2024/06/06 03:03

第一章:什么是正则表达式

定义
1. 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法。
2. 通过定义的这些特殊符号的辅助,系统管理员就可以快速的过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理的。
3. 为了处理大量文本|字符串而定义的一套规则和方法。以行为单位出来,一次处理一行。
4. 为了处理大量文本|字符串而定义的一套规则和方法。以行为单位出来,一次处理一行。

注意事项
1. 正则表达式应用非常广泛,存在于各种语言中,php、perl、python、grep、sed、awk支持。ls*通配符。
2. Linux中的正则表达式,最为常用正则表达式的命令是grep(egrep)、sed、awk。

正则表达式分类
1. 基本正则表达式(BRE basic regular expression)
2. 高级功能:扩展正则表达式(ERE,extended regular expression)

BRE和ERE的区别仅仅是元字符的不同
1. BRE(基础正则表达式)只承认的元字符有^ $ .[ ] * 其他字符识别为普通字符;
2. ERE(扩展正则表达式)则添加了(){ } ? + |等。

如何区分通配符和正则表达式

  1. 不需要思考的判断方法:在三剑客awk、sed、grep、egrep都是正则,其他都是通配符。
  2. 文件目录名==通配符
  3. 文件内容(字符串,文本,文件内容)==正则表达式
  4. 通配符和正则表达式都有“*”“?”“[ ]”,但是通配符的这些符号都能自身代表任意字符,而正则表达式的这些符号只能代表这些符号前面的字符。

第2章 基本正则表达式案例

【^】^for 找以for开头的内容

[root@mysql-db01 script]# cat test.sh #!/bin/bash. /etc/init.d/functions[ -d /oldboy ] && cd /oldboy || mkdir -p /oldboy && cd /oldboyfor i in `echo oldboy{00..10}`; do    word=`uuidgen|md5sum |tr "0-9" "a-z"|cut -c 1-10`    touch ${word}_$i.html    if [ $? -eq 0 ]; then        action "${word}_$i.html" /bin/true    fidone[root@mysql-db01 script]# egrep "^f" test.sh for i in `echo oldboy{00..10}`; do

【$】过滤以y结尾的

[root@mysql-db01 script]# egrep  "y$" test.sh [ -d /oldboy ] && cd /oldboy || mkdir -p /oldboy && cd /oldboy

【^$】表示空行 文件里面的空行 三剑客老三grep -n显示行号

[root@mysql-db01 script]# egrep -n "^$" test.sh 3:

【.】点代表且只能代表任意一个字符/文本/符号(不匹配空行)扩展:.的其他含义:当前目录,加载文件source或. /etc/profile

[root@Never-downtime gqc]# grep "." oldboy.txt I am oldboy teacher!I teach linux.I like badminton ball ,billiard ball and chinese chess![root@Never-downtime gqc]# grep "oldb.y" oldboy.txt I am oldboy teacher![root@Never-downtime gqc]# grep "\.$" oldboy.txt I teach linux.

【\】转义字符 以.结尾

[root@Never-downtime gqc]# grep "\.$" oldboy.txt I teach linux.

【*】重复前一个文本/字符0次或多次,之前的一个文本或字符连续0个或多个重复/连续0次的时候,表示啥也没有(空),匹配出文件所有内容。

[root@Never-downtime gqc]# grep "0*" oldboy.txt I am oldboy teacher!I teach linux.I like badminton ball ,billiard ball and chinese chess!

【.*】匹配所有字符/文本。^.*以任意多个字符开头;.*$以任意多个字符结尾;

[root@Never-downtime gqc]# grep ".*" oldboy.txt I am oldboy teacher!I teach linux.

【0*】正则表达式表示重复或连续的时候

[root@mysql-db01 script]# egrep -o "0*" test.sh 000000[root@mysql-db01 script]# egrep "0" test.sh for i in `echo oldboy{00..10}`; do    word=`uuidgen|md5sum |tr "0-9" "a-z"|cut -c 1-10`    if [ $? -eq 0 ]; then[root@Never-downtime gqc]# egrep "90*" oldboy.txt my qq num is 49000448.not 4900000448.[root@Never-downtime gqc]# grep "^.*o" oldboy.txt I am oldboy teacher!I like badminton ball ,billiard ball and chinese chess!

[abc][0-9][.,/] 匹配字符集合(一个筐里有很多条件)内的任意一个字符a或b或c;[a-z]匹配所有小些字母。中括号:表示一个整体,中括号里暗藏着无限的可能[abc]找a或b或c 可以写成[a-c]

[root@Never-downtime gqc]# grep [abc] oldboy.txt I am oldboy teacher!I teach linux.[root@Never-downtime gqc]# grep [a-z] oldboy.txt I am oldboy teacher!I teach linux.[root@Never-downtime gqc]# grep [a-zA-Z0-9] oldboy.txt I am oldboy teacher!I teach linux.not 4900000448.

练习题 oldboy.txt里面找m或n或o开头的并且以m或g结尾的行!

[root@Never-downtime gqc]# egrep "^[mno].*[mg]$" oldboy.txt my blog is http://oldboy.blog.51cto.comour site is www.etiantian.org

第三章 高级扩展正则

【^】^word 找以word开头的内容

[root@Never-downtime gqc]# grep "^m" oldboy.txt my blog is http://oldboy.blog.51cto.commy qq num is 49000448.my god ,i am not oldbey,but OLDBOY!

*【[^mn]】排除m或n开头的行*

[root@Never-downtime gqc]# egrep "^[^mn]" oldboy.txt I am oldboy teacher!I teach linux.I like badminton ball ,billiard ball and chinese chess!

【a{n,m}】重复a字符n到m次

[root@Never-downtime gqc]# egrep  "0{1,3}" oldboy.txt my qq num is 49000448.not 4900000448.

【+】重复前一个字符一次或一次以上,前一个字符连续一个或多个,可以去除连续的前一个字符。

[root@Never-downtime gqc]# egrep -o  "0+" oldboy.txt 00000000[root@mysql-db01 script]# egrep "d+" test.sh . /etc/init.d/functions[ -d /oldboy ] && cd /oldboy || mkdir -p /oldboy && cd /oldboyfor i in `echo oldboy{00..10}`; do    word=`uuidgen|md5sum |tr "0-9" "a-z"|cut -c 1-10`    touch ${word}_$i.html        action "${word}_$i.html" /bin/truedone[root@Never-downtime gqc]# egrep -o  "[a-z]+" oldboy.txt amoldboyteacherteach

【|】表示或者 同时过滤多个字符

[root@Never-downtime gqc]# egrep  "3306|1521" /etc/services mysql           3306/tcp                        # MySQLmysql           3306/udp                        # MySQLncube-lm        1521/tcp                # nCube License Managerncube-lm        1521/udp                # nCube License Manager[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i  "inode size|inode count"dumpe2fs 1.41.12 (17-May-2010)Inode count:              593344Inode size:           256[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i  "^block size|^block count"dumpe2fs 1.41.12 (17-May-2010)Block count:              2373376Block size:               4096

【()】分组过滤被括起来的东西表示一个整体(一个字符),后向引用。

[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "inode size|inode count"dumpe2fs 1.41.12 (17-May-2010)Inode count:              593344Inode size:           256[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "inode (size|count)"dumpe2fs 1.41.12 (17-May-2010)Inode count:              593344Inode size:           256[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "block (size|count)"dumpe2fs 1.41.12 (17-May-2010)Block count:              2373376Reserved block count:     118668Block size:               4096[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "(block|inode) (size|count)"dumpe2fs 1.41.12 (17-May-2010)Inode count:              593344Block count:              2373376Reserved block count:     118668Block size:               4096Inode size:           256[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i  "(inode|^block) (size|count)"dumpe2fs 1.41.12 (17-May-2010)Inode count:              593344Block count:              2373376Block size:               4096Inode size:           256

这里写图片描述