正则表达式和通配符的区别
正则表达式:处理的是文本内容中的字符
通配符:用来处理文件名
正则表达式(支持的工具:grep、egrep、sed、awk)
1.代表字符(元字符)
2.表示次数
3.位置锚定
4.分组或其他
基础正则表达式常见的元字符(字符匹配)
不表示本来的含义,在正则表达式中有特殊含义的字符
| 字符 | 含义 |
|---|---|
| . | 单个任意字符,可以是一个汉字 |
| \ | 转义字符,用于取消特殊符号的含义 |
| 匹配指定范围内的任意单个字符 | |
| :alnum: | 字母和数字 |
| :alpha: | 代表任何英文大小写字符 |
| :lower: | 小写字母 |
| :upper: | 大写字母 |
| . | 任何元字符放在在方括号里都代表他原来的意思,.在里面意思就是. |
| \^ | 匹配指定范围外的任意单个字符,例如\^0-9匹配任意一位非0-9里的字符 |
表示次数
| 字符 | 含义 |
|---|---|
| * | 匹配前面的字符任意次数,0到正无穷次 |
| .* | 任意长度字符,不包括0次 |
| \? | 0或一次,可有可无的 |
| \ + | 1次到正无穷次 |
| \ {3 \ } | 前面的字符出现三次 |
| \ {3,5 \ } | 前面的字符出现3到5次 |
| \ {3, \ } | 前面的字符最少出现三次 |
| \ {,5 \ } | 前面的字符最多出现5次 |
位置锚定
| 字符 | 含义 |
|---|---|
| ^ | 代表开头的行 |
| $ | 代表结尾的行 |
| ^PATTERN$ | 用于模式匹配整行 (单独一行 只有root) |
| ^$ | 空行 |
| ^\[:space:]*$ | 空白行 |
| \ < | 代表以什么字符为开头,等同于\b |
| \ > | 代表以什么字符为结尾,等同于\b |
echo hello-123 |grep "\ <123"
echo hello_123 |grep "\ <123"
echo hello 123 |grep "\ <123"
除了 字母 数字 下划线其他都算 单词的分隔符
分组或其他
分组:用括号( )将需要组合的字符括起来,当作一个整体去处理,如(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为:\1,\2,\3......分组
\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
或者
或者:\|
扩展正则表达式元字符:(支持的工具:egrep、awk)
| 字符 | 含义 |
|---|---|
| + | 匹配前面子表达式1次以上,例:go+d,将匹配至少一个o,good、gooood、gooooood都可以匹配到 |
| ? | 匹配前面子表达式0次或1次,例:go?d,将匹配gd或者god |
| () | 将括号中的字符串看作是一个整体,例:g(oo)+d,将匹配oo整体一次以上,如good、goooood等 |
| | | 以或的方式匹配字符串,例:g(oo|la)d,将匹配good或者glad |
实验题
如何查找ip地址
ifconfig ens33|grep netmask|grep -o '0-9\+\.0-9\+\.0-9\+\.0-9\+'
ifconfig ens33|grep netmask|grep -o '0-9\{1,3\}\.0-9\{1,3\}\.0-9\{1,3\}\.0-9\{1,3\}'

筛选出ip地址的四个分段
0-9\{1,3}\:三位数,每位是0-9的范围
表示qq号
echo "aa940132245" |grep "\b0-9\{6,12\}\b"
表示邮箱
echo "zhou@qq.com" |grep -E "\[:alnum:]+@\[:alnum:]+\.\[:alnum:_]+"
表示手机号
echo "13705173391"|grep -E "\b134567890-9{9}\b"