一、正则表达式
正则表达式和通配符的区别:
①式用来在文件中匹配符合条件的字符串。通配符用来匹配符合条件的文件名
②grep,awk,sed 等命令可以支持正则表达式,ls,find,cp 这些命令不支持正则表达式,只能用通配符进行匹配
基础正则表达式
* 前一个字符匹配0次或任意多次。如果是通配符,直接表示任意内容
gjl@gjl-virtual-machine:~/shellTest$ grep "a*" test01.sh gjl@gjl-virtual-machine:~/shellTest$ grep "a*to" test01.sh a* 代表匹配出0个或多个包含a的行,如果想要匹配出一个以上,使用aa*
. 匹配除了换行符以外匹配任意内容
gjl@gjl-virtual-machine:~/shellTest$ grep ".*" test01.sh 匹配任意字符 gjl@gjl-virtual-machine:~/shellTest$ grep "o..r" test01.sh 匹配o和r之间有两位的字符
^ 匹配行首,$ 匹配行尾
gjl@gjl-virtual-machine:~/shellTest$ grep "^r" test01.sh 匹配行首 gjl@gjl-virtual-machine:~/shellTest$ grep "r$" test01.sh 匹配行尾 gjl@gjl-virtual-machine:~/shellTest$ grep "\"$" test01.sh 匹配以“结尾的,需要转义符 gjl@gjl-virtual-machine:~/shellTest$ grep -v "^$" test01.sh 剔除空行
[]匹配中括号中的任意一个字符
gjl@gjl-virtual-machine:~/shellTest$ grep "[==]" test01.sh 匹配包含=的字符 gjl@gjl-virtual-machine:~/shellTest$ grep "[0-9]" test01.sh 匹配包含数字的字符
[^]匹配除了中括号中的任意一个字符
gjl@gjl-virtual-machine:~/shellTest$ grep "[^a-z]" test01.sh 不包含字母的字符 gjl@gjl-virtual-machine:~/shellTest$ grep "[^0-9]" test01.sh 不数字的字符 gjl@gjl-virtual-machine:~/shellTest$ grep "^[^a-z]" test01.sh 以非字母开头的字符
/ 转义符,用于取消特殊符号的含义
\{n\} 表示前面字符出现n次
\{n,} 表示前面字符至少出现n
\{n,m\} 表示前面字符至少出现n次,最多出现m次
gjl@gjl-virtual-machine:~/shellTest$ grep "o\{2\}" test02.sh gjl@gjl-virtual-machine:~/shellTest$ grep "[0-9]\{5\}" test02.sh gjl@gjl-virtual-machine:~/shellTest$ grep "[0-9]\{3,\}" test02.sh gjl@gjl-virtual-machine:~/shellTest$ grep "[0-9]\{3,5\}" test02.sh
注意:如果使用grep -E,\{n\}中转义符可以不需要
二、扩展正则
扩展正则必须使用egrep 或grep -E 选项
+ 前一个字符匹配一次或任意多次
?前一个字符匹配0次或1次
| 匹配两个或多个字符
() 匹配其整体为一个字符
gjl@gjl-virtual-machine:~/shellTest$ grep -E "a+d" test02.sh gjl@gjl-virtual-machine:~/shellTest$ grep -E "a?d" test02.sh gjl@gjl-virtual-machine:~/shellTest$ grep -E "i(a|s)" test02.sh
三、案例
①过滤邮箱
gjl@gjl-virtual-machine:~/shellTest$ grep -E "[a-z0-9A-Z_]+@[0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+){1,3}" test02.sh 123@weq.com qwe@123.cn 123@12.com gjl@gjl-virtual-machine:~/shellTest$