正则表达式:
由一类特殊字符及文本字符所编写的模式类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql等
主要作用
主要用来匹配字符串(命令结果,文本内容)
通配符只用于匹配文件名、目录名等,不能用于匹配文件内容。(而且是已存在的文件或者目录)
正则表达式是处理文件类容
通配符是用来处理文件名的
常用的通配符
* | 通配符匹配任意一个或多个字符 |
? | 匹配一个任意字符 |
[ ] | [list] 匹配list中任意单个字符 |
1.匹配所有以*结尾的字符
2.匹配一个任意字符
3. [list] 匹配list中任意单个字符
基本正则表达式
元字符:
. | 匹配任意单个字符,可以是一个汉字 |
() | 使用转义符,只表示\(\) |
[^] | 匹配指定范围内的任意单个字符,示例:[dn] [0-9] [] [a-zA-Z] [:alpha:] |
[[:blank:]] | 空白字符(空格和制表符) |
. 匹配任意单个字符,可以是一个汉字
t\.t 加了\斜杠他就是.了 \斜杠的意思是转义转回原本的意思就是点
[ ] 匹配指定范围内的任意单个字符,示例:[dn] [0-9] [] [a-zA-Z] [:alpha:]
匹配小写 [a-z]
匹配大写 [A-Z]
匹配大小写 [ a-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^dn] [^a.z]
[^A-Z] 取反 过滤掉A-Z 其他全都要
‘t..t’ 点还代表仍以字符
‘r\.\.t’ 加了斜杠就代表转义符 这时候点就是点了 就匹配不到了
正则表达式和通配符的区别
cat 10.txt | grep [[:space:]] 10.txt 匹配空格
表示次数
* | 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配 |
.* | 任意长度的任意字符,不包括0次,也就是匹配所有 |
\? | 匹配其前面的字符出现0次或1次,即:可有可无 |
\+ | 匹配其前面的字符出现最少1次,即:肯定有且 >=1 次 |
\{n\} | 匹配前面的字符=n次 |
\{n,n\} | 匹配前面的字符至少m次,至多n次 |
\{n\} | 匹配前面的字符至多n次,<=n |
\{n,\} | 匹配前面的字符至少n次 |
代表前面的0出现2次
代表前面出现过2次以上
代表前面出现2次以上 5次一下
表示0次到任意次
.*匹配所有
实战练习正则表达式
1.把 ifconfig ens33 ip地址 网关 子网掩码 使用正则表达式的方式显示出来
2.打印自己的QQ邮箱
3.cat |/etc/fstab 把面#号空格给过滤掉 只要下面4行uuid 号
位置错定
^ | #行首错定,用于模式的最左侧 |
$ | #行尾错定,用于模式的最右侧 |
^ | roots #用于模式匹配整行 (单独一行 只有root) |
^ $ | #空行 |
cat /etc/fstab | grep -v "^#" | grep -v "^s"
分组
分组:()将多个字符捆绑在一起,当作一个整体
或者:\ |
分组的方式 获得1和2
宽展正则表达式
grep -E 主要用于正则表达式
表示次数
* | 匹配前面字符任意次 |
? | 0或1次 |
+ | 1次或多次 |
{n} | 匹配n次 |
{n,n} | 至少m,至多n次 |
{,n} | 匹配前面的字符至多n次,<=n,n可以为0 |
{n,} | 匹配前面的字符至少n次,<=n,n可以为0 |
使用扩展正则把 ifconfig ens33 ip地址 网关 子网掩码显示出来
把电话号码写入文本中在正则表达式写出来
025-83346023
0510-8776655
0527-9888899
使用正则表达式匹配手机号码
和上面一样 把手机号码写入文本中
使用扩展正则表达式匹配邮箱号
方法一 cat 4.txt | grep -E "[a-Z0-9\.]@*" 这个方法可以是可以 但是不严谨
方法二 这就是这是正确” [0-9a-zA-Z]+\.[a-z]{a-z}{,3}+“
使用扩展正则表达式匹配
987-123-4567
987 456-1230
(123) 456-7890
方法一 简单 但不严谨
cat 5.txt | grep -E "[\(0-9){,3}-]"
第二种方法 严谨 有点复杂
grep -E "(\([0-9]+\)|[0-9]+)[ -]?[0-9]+[ -]?[0-9]+" 5.txt