Linux笔记11——shell编程基础-5
一、正则表达式
- 通配符的功能,结合系统命令进行模糊查询,跟find结合用来查询指定名称的文件名
- 而正则表达式是在文件中匹配符合条件的字符串,常跟grep命令结合进行精确匹配
- 扩展正则是对基础正则的补充,结合grep时需要用-E选项,或直接用egrep命令
二、基础正则表达式
元字符 | 作用 |
. | 匹配除换行符以外的任意一个字符 |
* | 前一个字符匹配0次或任意多次 |
^ | 匹配行首 |
$ | 匹配行尾 |
[] | 匹配中括号中指定的任意一个字符 |
[^] | 匹配除中括号指定字符以外的任意一个字符 |
\ | 转义符,用于取消特殊符号的含义 |
三、扩展正则表达式
扩展元字符 | 作用 |
+ | 前一个字符匹配1次或任意多次 |
? | 前一个字符匹配0次或1次 |
{n} | 表示前一个字符恰好出现n次 |
{n,} | 表示前一个字符出现不小于n次 |
{n,m} | 表示前一个字符最少出现n次,最多出现m次 |
| | 匹配两个或多个分支选择 |
() | 匹配括号内的整体,可以理解为由多个单字符组成的大字符 |
扩展正则的写法:(1)grep \? test.txt(2)grep -E test.txt(3)egrep " " test.txt
四、准备测试数据
1.测试数据
[root@localhost ~]# cat test.txt
ni
hao
ma?
123
abc123
aBc123
aBC123
123abc
a
bb
ab
abb
abbb
abcde
ccc
bbbddd
ni hao ma?
ni hen hao
ni bu hao
bu bu hao
index.php
index2php
2.字符匹配
#匹配具体的字符
[root@localhost ~]# grep "abc" test.txt
abc123
123abc
abcde#匹配asd中的任意一个字符
[root@localhost ~]# grep "[asd]" test.txt
#匹配除asd的任意一个字符
[root@localhost ~]# grep "[^asd]" test.txt
#[]含义是匹配中括号中任意一个字符,注意只能匹配一个字符
#[^]含义是匹配不含有中括号里任意一个字符的行,注意也是一个一个字符匹配#区别于grep -V
[root@localhost ~]# grep -v "[asd]" test.txt #匹配任意一个字符
[root@localhost ~]# grep "h.o" test.txt
3.位置匹配
注:^匹配行首,$匹配行尾
#匹配以b开头的行
[root@localhost ~]# grep "^b" test.txt #匹配不是以小写字母开头的行
[root@localhost ~]# grep "^[^a-z]" test.txt #匹配以o结尾的行
[root@localhost ~]# grep "o$" test.txt #匹配以.php结尾的行,因为.有特殊含义,所以需要使用\转义
[root@localhost ~]# grep "\.php" test.txt #匹配以a开头,以3结尾的行
[root@localhost ~]# grep "^a.*3$" test.txt #匹配空行
[root@localhost ~]# grep "^$" test.txt #匹配纯数字行
[root@localhost ~]# egrep "^[0-9]+$" test.txt
4.次数匹配
注:所有匹配次数的都是针对它前一个字符而言的
#*是匹配前一个字符出现任意多次(0次或任意多次
[root@localhost ~]# grep "a*" test.txt
[root@localhost ~]# grep "a*" test.txt | wc -l
22#扩展正则生效的写法
[root@localhost ~]# grep "b\?" test.txt [root@localhost ~]# grep -E "b?" test.txt [root@localhost ~]# egrep "b?" test.txt #匹配合适的行
[root@localhost ~]# egrep "ab?" test.txt [root@localhost ~]# egrep "ab*" test.txt [root@localhost ~]# egrep "ab+" test.txt #{n} 表示前面的字符恰好出现n次
[root@localhost ~]# egrep "b{2}" test.txt #{n,} 表示其前面的字符出现不小于n次
[root@localhost ~]# egrep "b{2,}" test.txt #{n,m} 匹配其前面的字符出现不小于n次,最多出现m次
[root@localhost ~]# egrep "b{1,2}" test.txt [root@localhost ~]# egrep "^b{1,2}" test.txt
5.分支和整体匹配
#同时匹配ni hen hao和ni bu hao
[root@localhost ~]# egrep "ni he|bu" test.txt
ni hen hao
ni bu hao
bu bu hao
[root@localhost ~]# egrep "ni (he|bu)" test.txt
ni hen hao
ni bu hao
#可以匹配一个整体的个数,类似匹配字符个数
[root@localhost ~]# egrep "(bu)+" test.txt
ni bu hao
bu bu hao
五、正则表达式练习
问题1:用户登录
当用户输入用户名root和密码123时,打印绿色登录成功,,否则打印红色登录失败(用户名由4-8位的数字、字母、下划线组成,且数字不在开头)
[root@localhost ~]# bash denglu.sh
please enter your name:root
please enter your password:123
root
登录成功
[root@localhost ~]# bash denglu.sh
please enter your name:rerw1
please enter your password:13424
rerw1
登录失败
[root@localhost ~]# bash denglu.sh
please enter your name:ef
please enter your password:1213
验证失败[root@localhost ~]# cat denglu.sh
#!/bin/bash
read -p "please enter your name:" name
read -p "please enter your password:" passwdecho "$name" | egrep "^[a-zA-Z_][0-9a-zA-Z_]{3,7}$"
yanzheng=`echo $?`
[ "$yanzheng" -eq 0 ] && ([ "$name" == root ] && [ "$passwd" == 123 ] && echo -e "\e[32m登录成功\e[0m" || echo -e "\e[31m登录失败\e[0m") || echo "验证失败"
[root@localhost ~]#
问题2:电话号码
匹配电话号码,以区号025开头,号码是5或8开头的八位数,区号和号码间可以是空格,-或没有
[root@localhost ~]# cat telephone.txt
02588888888
025-5555555555
025 12345678
025 54321678
025ABC88888
025-85432109
028-85643210
0251-52765421
[root@localhost ~]# egrep "^(025)[ -]?[58][0-9]{7}$" telephone.txt
02588888888
025 54321678
025-85432109
[root@localhost ~]#
问题3:手机号码
手机号匹配需求,长度11位,第一位是1,第二三位是130、131、132、145、155、156、185、186,剩余位无限制
[root@localhost ~]# echo "" | egrep "^1(3[0-2]|45|[58][56])[0-9]{8}$"
问题4:邮箱地址
匹配邮箱(邮箱格式:用户名@二级域名.顶级域名);用户名:字符长度5-17位,是除@和空格以外的任意字符,开头只能是字母或_;二级域名:长度不限,符号为数字、小写字母、中横线-(不能连续,不在行尾);顶级域:域名后缀范围在.com,.cn,.com.cn中
[root@localhost ~]# cat mail.txt
zhangsan123@qq.com
li si@163.com
wang@wu@sina.com
zhao liu@126.com
qianqi@sina.com.cn
tester_ni@-sina.com.cn
wangwu@sina.2com.cn
_user1@@jd-1.com
[root@localhost ~]# egrep "^[a-zA-Z_][^@ ]{4,16}@(-[0-9a-z]|[0-9a-z])+\.c(om|n|om\.cn)$" mail.txt
zhangsan123@qq.com
qianqi@sina.com.cn
tester_ni@-sina.com.cn
[root@localhost ~]#
问题5:IP地址
[root@localhost ~]# ip add | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
127.0.0.1
192.168.66.66
192.168.66.255
[root@localhost ~]# ip add | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | grep -v "127" |grep -v "255"
192.168.66.66
[root@localhost ~]#