shell正则表达式

1.正则表达式

正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等.

作用: 进行数据检索、数据处理

数据检索,一般针对的,日志文件(非结构化数据)

2.应用场景

  1. 数据验证 (表单验证、手机、邮箱、ip)

  2. 数据检索(数据检索、数据抓取)

  3. 数据过滤(敏感词过滤)(数据脱敏)

3.正则表达式详解

分为两部分: 1.普通字符匹配 2. 正则匹配符匹配

普通字符匹配:精准匹配

正则匹配字符:模糊匹配

正则匹配三步走:① 查什么 ② 查多少 ③ 从哪查

☆ 查什么(元字符)

代码 功能
.(我是一个英文状态下点号.) 万能字符,匹配任意1个字符(除了\n)
[] 匹配[ ]中列举的字符,字符簇,本身表示一个范围区间,每次只能匹配其中的某个字符
[^指定字符] 匹配除了指定字符以外的所有字符,^托字节在字符簇中出现代表取反的意思
\d 匹配数字,即[0-9],\d都称之为Perl风格语法
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、_
\W 匹配特殊字符,即非字母、非数字、非下划线

grep 选项-E 和-P 区别

普通用法:grep 关键词 字符串

正则用法:

grep -E 正则表达式 字符串

grep -P 正则表达式 字符串

只要字符串中没有""就使用 -E

注意: -E 还有一个就是-Ev: 是对匹配到的内容取反操作

-P 选项功能更强大;支持\d, \w, \b(单词边界)等

使用原则:一般优先使用-E,如果遇到\d、\w、\s的时候才会使用-P;如果正则表达式正确,但是-E匹配不到内容,尝试使用-P!!!
echo "abc123" |grep '[0-9]'

echo "abc123" |grep -P '\w' # \w既包含字母、又包含数字还包含下划线

echo "abc123" |grep -E '[0-9a-zA-Z]'

echo "abc.123" |grep -E '.' # 万能字符

echo "abc.123" |grep -E '\.' # 匹配.点号

echo "abc123" |grep -E '[^0-9]'

echo "abc 123" |grep -P '\s' # 匹配空格

echo "abc 123" |grep -P '\S' # 匹配非空格

☆ 查多少(匹配符)

注意:它只能匹配前一个字符出现次数

代码 功能
* 匹配前一个字符出现0次或者无限次,即可有可无,简称0到多 (至少0次)
+ 匹配前一个字符出现1次或者无限次,即至少有1次,简称1到多 (至少1次)
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有,简称0或1 (最少0次,最多1次)
{m} 匹配前一个字符出现m次,{3},匹配前一个字符只能出现3次
{m,} 匹配前一个字符至少出现m次,{3,},匹配前一个字符至少出现3次,相当于3到多
{m,n} 匹配前一个字符出现从m到n次,{3,5},匹配前一个字符至少出现3次,至多出现5次

重点记住前四个

如果不确定要匹配内容的多少,也不确定具体要匹配什么内容,而是匹配所有内容。

特殊写法 => .* 匹配任何内容

正则可以编写为: <body>(.*)</body>

正则表达式中,有一个匹配原则(贪婪匹配):默认情况下,正则能匹配多的就不会匹配少的,我们把这种特性称之为贪婪匹配!!!

☆ 从哪查(定位符)

代码 功能
^ 托字节,匹配字符串开头,^/dev:匹配以/dev开头的行
$ 匹配字符串结尾

注意:

1.可以只有开头,没有结尾

例子:可以以xxx开头查找

2.可以只有结尾,没有开头

例子:可以以xxx结尾查找

4. 分组、捕获、反向引用(重点)

作用: 主要是进行重复数据的匹配操作

举个栗子:1234-1111-1221-3333

在之前的匹配中,我们只能匹配连续的4位数字,如\d{4}或[0-9]{4}

要求:要求使用正则匹配1111以及3333这种格式的数字(特点:匹配4位连续相同的数字,内容完全相同)

要求:要求使用正则匹配1221这种格式的数字(特点:第1位和第4位内容相同,第2位和第3位内容相同)


☆ 分组(把相同的内容 分到1组)

在正则表达式中,通过一对圆括号括起来的内容,我们就称之为"分组"。

\d\d\d:匹配连续的3位数字

\d(\d)(\d) :正则表达式中\d\d\d中,(\d)(\d)就是分组(子表达式),一共有两个()圆括号,则代表两个分组

☆ 捕获

当正则表达式在字符串中匹配到相应的内容后,计算机系统会自动把分组所匹配的到内容放入到系统的对应缓存区中(缓存区从$1开始)

☆ 反向引用

在正则表达式中,我们可以通过\n(n代表第n个缓存区的编号)来引用缓存区中的内容,我们把这个过程就称之为"反向引用"。

案例1:

① 查找连续的四个数字,如:3569

复制代码
答:[0-9]{4}或\d{4}

② 查找连续的相同的四个数字,如:1111

复制代码
答:(\d)\1\1\1

③ 查找数字,如:1221,3443

复制代码
答:(\d)(\d)\2\1

④ 查找字符,如:AABB,TTMM(提示:A-Z,正则:[A-Z])

复制代码
答:([A-Z])\1([A-Z])\2

⑤ 查找连续相同的四个数字或四个字符(提示:\w)

复制代码
答:(\w)\1\1\1

注:以上都是Perl风格写法,grep必须配合-P使用

小结:

作用:主要是进行重复数据的匹配操作

有几个小括号就有几个分组,执行顺序都是从左向右 => (\d)(\d)

相关推荐
sztomarch17 分钟前
Router-Routing
linux·运维·服务器·前端·网络
achene_ql29 分钟前
手写muduo网络库(七):深入剖析 Acceptor 类
linux·服务器·开发语言·网络·c++
凉、介37 分钟前
Linux 下 pcie 初始化设备枚举流程代码分析
linux·运维·服务器·学习·嵌入式·c·pcie
霖檬ing39 分钟前
GFS(Gluster)分布式文件系统
运维
Zhao·o39 分钟前
Couchbase 可观测性最佳实践
linux·couchdb
houhuan1281 小时前
楼宇自控新方向:电力载波技术——低成本、高兼容性的智能未来
大数据·运维·网络·人工智能·3d
扶尔魔ocy1 小时前
欧拉系统openEuler-24.03忘记密码,如何改密码
linux·运维·服务器
1nullptr1 小时前
【持续更新】linux网络编程试题
linux·服务器·网络
天朝八阿哥1 小时前
Debian开机自动挂载ntfs分区
linux·后端·debian
星梦客1 小时前
VMware 虚拟机开机自启动配置指南
linux·运维·服务器