第一章:什么是正则表达式
定义
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(扩展正则表达式)则添加了(){ } ? + |等。
如何区分通配符和正则表达式
- 不需要思考的判断方法:在三剑客awk、sed、grep、egrep都是正则,其他都是通配符。
- 文件目录名==通配符
- 文件内容(字符串,文本,文件内容)==正则表达式
- 通配符和正则表达式都有“*”“?”“[ ]”,但是通配符的这些符号都能自身代表任意字符,而正则表达式的这些符号只能代表这些符号前面的字符。
第2章 基本正则表达式案例
【^】^for 找以for开头的内容
[root@mysql-db01 script]# cat test.sh
#!/bin/bash
. /etc/init.d/functions
[ -d /oldboy ] && cd /oldboy || mkdir -p /oldboy && cd /oldboy
for 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
fi
done
[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
00
0
0
0
0
[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.com
our site is www.etiantian.org
第三章 高级扩展正则
【^】^word 找以word开头的内容
[root@Never-downtime gqc]# grep "^m" oldboy.txt
my blog is http://oldboy.blog.51cto.com
my 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
000
00000
[root@mysql-db01 script]# egrep "d+" test.sh
. /etc/init.d/functions
[ -d /oldboy ] && cd /oldboy || mkdir -p /oldboy && cd /oldboy
for 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/true
done
[root@Never-downtime gqc]# egrep -o "[a-z]+" oldboy.txt
am
oldboy
teacher
teach
【|】表示或者 同时过滤多个字符
[root@Never-downtime gqc]# egrep "3306|1521" /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@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "inode size|inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count: 593344
Inode size: 256
[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "^block size|^block count"
dumpe2fs 1.41.12 (17-May-2010)
Block count: 2373376
Block size: 4096
【()】分组过滤被括起来的东西表示一个整体(一个字符),后向引用。
[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "inode size|inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count: 593344
Inode size: 256
[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "inode (size|count)"
dumpe2fs 1.41.12 (17-May-2010)
Inode count: 593344
Inode size: 256
[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "block (size|count)"
dumpe2fs 1.41.12 (17-May-2010)
Block count: 2373376
Reserved block count: 118668
Block size: 4096
[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "(block|inode) (size|count)"
dumpe2fs 1.41.12 (17-May-2010)
Inode count: 593344
Block count: 2373376
Reserved block count: 118668
Block size: 4096
Inode size: 256
[root@Never-downtime gqc]# dumpe2fs /dev/sda3 |egrep -i "(inode|^block) (size|count)"
dumpe2fs 1.41.12 (17-May-2010)
Inode count: 593344
Block count: 2373376
Block size: 4096
Inode size: 256