shell之正则表达式及三剑客grep命令

news2024/12/23 10:53:07

一、正则表达式概述

什么是正则表达式?

正则表达式是一种描述字符串匹配规则的重要工具

1、正则表达式定义:

正则表达式,又称正规表达式、常规表达式

使用字符串描述、匹配一系列符合某个规则的字符串


正则表达式

普通字符:

大小写字母、数字、标点符号及一些其它符号


元字符:

在正则表达式中具有特殊意义的专用字符


正则表达式的层次分类

基础正则表达式
扩展正则表达式


Linux三剑客(grep、sed、awk)支持的正则表达式

shell是不支持正则表达式的(shell支持的是通配符)。shell中的正则表达式只有个别命令支持的,一般常用的是Linux三剑客

支持正则的shell命令正则类型
grep默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符)
egrep 或grep -E使用扩展的正则表达式(ERE)
sed默认使用基本正则表达式(BRE)
awk使用扩展正则表达式(ERE)

2 基础正则表达式的元字符

基础正则表达式是常用的正则表达式部分

2.1 匹配字符

\ : 表示转义字符,去掉特殊符号的特殊含义

\n : 匹配换行符

\t : 匹配制表符

\w : 匹配单词字符(单词字符:a-z,A-Z,0-9,_ )

\W : 匹配非单词字符

\S : 匹配非空白字符

\s : 匹配空白字符

\d : 匹配数字

\D : 匹配非数字

. : 表示匹配任意单个字符(默认情况下,. 无法匹配换行符)

2.2 中括号表达式
字符组: 普通中括号包围的字符组,表示某个单个字符匹配中括号内的任意字符即匹配成功

x[abc]z :

可以匹配包含“xaz”、“xbz”、“xcz”的字符串


取反表示法:

中括号内开头使用 ^ ,表示只要不是中括号内的字符就匹配


x[ ^abc]z :

可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串


范围表示法

[a-z]:

表示任意单个小写字母

[ ^a-z] :

匹配非小写字母的其它任意字符串


[A-Z] :

表示任意单个大写字符

[0-9] :

表示任意单个数字

注意:[0-59],表示匹配0、1、2、3、4、5、9,而不是0-59中间的数值


[a-z0-9A-Z] : 表示任意字母或数字

[a-z0-9A-Z_] : 表示任意字符、数字或下划线,也就是匹配单个字符

特殊的元字符在中括号中匹配

想要在中括号中匹配: ^ ,需要将其放在 中括号非开头的位置 ,如:[a^]
想要在中括号中匹配: - ,需要将其放在 开头位置或结尾位置 ,如:[abc-]、[-abc]
想要在中括号中匹配: ] ,需要将其放在 开头位置 ,如:[]abc]


2.3 位置匹配(锚定)

只匹配位置,不匹配字符,所以不会消耗字符数量,也称为零宽断言

^ : 匹配行首
$ : 匹配行尾


2.4 量词(重复匹配次数)


\{m\} : 表示匹配前一个字符或前一个子表达式m次

\{m,n\} : (m<n)表示匹配前一个字符或前一个字表达式最少m次,最多n次

\{m,\} : 表示匹配前一个字符或前一个子表达式至少m次

\{,n\} : 表示匹配前一个字符或前一个字表达式最多n次(匹配0次也算是成功)

*: 表示前一个字符或前一个子表达式匹配0次或多次,等价于:{0,}

.* : 匹配任意长度的任意字符
**注意:这些量词均为贪婪匹配模式,就是尽可能的去匹配符合条件的字符,例如:ab. *c 去匹配字符串:abbcdecfc,其中. * 部分匹配的将是bcdecf **

2 扩展正则表达式的元字符


2.1 扩展常用的量词


? : 表示匹配前一个字符或前一个子表达式0或1次,等价于:{0,1}或者{,1}

+: 表示匹配前一个字符或前一个子表达式1次或多次,就是最少一次,等价于:{1,}

2.2 二选一表达式


竖线 | 分隔左右两个正则子表达式,表示匹配任何一个即可,即a|b表示:a或者b,在结果上等价[ab];但是:[0-5] |\sa 表示0、1、2、3、4、5 或者 “ a”,这种转化不了为[]的形式。

使用二选一子表达式需要注意:

二选一元字符优先级很低,所以abc|def 表示的是abc或者def,等价于:(abc)|(def),而不是ab(c|d)ef。


2.3 分组捕获和反向引用


使用小括号()包围一部分正则表达式,这部分正则表达式即成为一个分组整体,也称为一个子表达式。

根据左括号的位置决定第几个分组

例如:(abc)def 、([a-d]){3}、 ([0-9]abc(def){2}(hgi))。
分组后可以使用\N 来反向引用对应的分组匹配结果,N是1-9的正整数,\1表示第一个分组表达式的匹配结果,\2表达第二个分组表达式的匹配结果。

注意:反向引用引用的是分组匹配后的结果,不是分组表达式

例如:正则表达式:(abc|def) and \1xyz 可以匹配字符串“abc and abcxyz ” 或“def and defxyz”,但是不能匹配“abc and defxyz” 或 “def and abcxyz”
 

二、grep命令的使用

1、grep命令简介

grep是一种强大的文本搜索工具,它能使用正则表达式,并把匹配的行打印出来。

格式

grep  [options]  pattern   [file]

options表示:选项; pattern 表示:匹配的的表达式 ; file 表示:文件名

例如:grep  -i  "root" /etc/passwd

2、常用选项

常用选项功能
-n列出所匹配的文本行,并显示行号
-i匹配时忽略字符大小写
-v反向匹配,匹配的字符串与搜索的不相符
-w精确匹配。匹配整个单词
-o只显示匹配的部分
-c显示匹配内容的行数

3、grep 的选项使用案例

案例:过滤出/etc/passwd中的root,并添加行号(-n)

 

案例:过滤出/etc/passwd 中的FTP,不区分大小写(-i)

案例:过滤/etc/passwd 中的不包含root的行,并且显示行号(-v)

 

案例:精准搜索单词,只匹配到单词所在的行(-w) 

 案例:将匹配到的单词罗列出来(-o)

 案例:显示匹配的内容的行数(-c)

三、grep加上正则使用案例

1、中括号表达式案例

案例1:搜索既可以查找shirt也可以查找short的单词所在行

 

 案例2:搜索oo前面不是大小写字母开头的行

案例3:查找包含数字的行 

2、位置锚定案例

案例1:搜索以.结尾的行

案例2:搜索以y开头的行 

3、量词案例

案例1:搜索2个oo的行 

 

为了匹配了6个o,但是要求搜索的是2个o?

答:因为正则表达式是一行一行的检索的,表达式是2个o,搜索的内容时一个很长的字符串。
先拿表达式中的第一个字符与字符串匹配,匹配不到,进行下一个匹配,最后匹配到了mgoooooood中的o
匹配成功,然后匹配第二个o,也匹配成功,然后就会将匹配的两个字符消耗掉,再继续重新匹配到下一个字符
最后消耗掉三次,也就是6个o,第7个o虽然匹配成功,但是第8个字符不是o,所以不会匹配成功。

 案例2:查看o这个字符,最少出现3次,最大出现6次

案例3:查找o这个字符,最少出现5次的行 

案例:特殊的量词案例 

4、二选一表达式和分组案例

案例1:搜索以y开头或者以d结尾的行

案例2:搜索shirt和short所在的行 

 四、总结

正则元字符描述grepegrepsedawk
\转义符,将特殊字符进行转义,忽略其特殊意义支持支持支持支持
^匹配行首支持支持支持支持
$匹配行尾支持支持支持支持
.匹配除换行符\n 之外的任意单个字符支持支持支持支持
[]匹配包含在[字符]之中的任意一个字符支持支持支持支持
[^]匹配[ ^z字符]之外的任意一个字符支持支持支持支持
[-]匹配 []中指定范围的任意一个字符,要写成递增支持支持支持支持
*匹配前导字符或子表达式0次或多次支持支持支持支持
匹配前导字符或子表达式0次或1次不支持(加\)支持不支持(加\)支持
+匹配前导字符或子表达式1次或多次不支持(加\)支持不支持(加\)支持
()匹配表达式,创建一个用于匹配的字串不支持(加\)支持不支持(加\)支持
{n}匹配前导字符或子表达式n次,可以为0不支持(加\)支持不支持(加\)支持
{n,}匹配前导字符或子表达式至少n次不支持(加\)支持不支持(加\)支持
{n,m}匹配前导字符或子表达式,最少匹配n次,最低匹配m次,n<=m不支持(加\)支持不支持(加\)支持
|交替匹配| 两边的任意一项不支持(加\)支持不支持(加\)支持

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/879133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LED全彩显示屏的前后维护

LED全彩显示屏的维护问题成为一个备受关注的难题。特别是对于采用镶嵌式或壁挂式安装的用户而言&#xff0c;检修和维护工作变得异常繁琐&#xff0c;仿佛一举一动都会影响整体运行。在这一背景下&#xff0c;LED全彩显示屏不仅需要符合严格的标准化要求&#xff0c;更需要具备…

【CHI】(三)网络层

网络层负责确定目标节点的NodeID。本章包含以下部分&#xff1a; 系统地址映射&#xff0c;SAM节点ID目标ID确定网络层flow示例 1. System address map 系统中每个Requester(包括RN和HN)必须有一个System Address Map(SAM)来决定一个request的target ID。SAM的范围可能只是简…

【Spring】深入探索 Spring AOP:概念、使用与实现原理解析

文章目录 前言一、初识 Spring AOP1.1 什么是 AOP1.2 什么是 Spring AOP 二、AOP 的核心概念2.1 切面&#xff08;Aspect&#xff09;2.2 切点&#xff08;Pointcut&#xff09;2.3 通知&#xff08;Advice&#xff09;2.4 连接点&#xff08;Join Point&#xff09; 三、Sprin…

Android复习(Android基础-四大组件)——Broadcast

1. 广播分类 广播的发送方式&#xff1a;标准广播、有序广播、粘性广播广播的类型&#xff1a;系统广播、本地广播 1.1 标准广播 完全异步&#xff0c;无序的广播发出后&#xff0c;所有的广播接收器几乎都会在同一时间收到消息。&#xff08;异步&#xff09;但是消息无法截…

科技云报道:算力之战,英伟达再度释放AI“炸弹”

科技云报道原创。 近日&#xff0c;在计算机图形学顶会SIGGRAPH 2023现场&#xff0c;英伟达再度释放深夜“炸弹”&#xff0c;大模型专用芯片迎来升级版本。 英伟达在会上发布了新一代GH200 Grace Hopper平台&#xff0c;该平台依托于搭载全球首款搭载HBM3e处理器的新型Grac…

Java并发之ReentrantLock

AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff1a;抽象队列同步器&#xff0c;是一种用来构建锁和同步器的框架。在是JUC下一个重要的并发类&#xff0c;例如&#xff1a;ReentrantLock、Semaphore、CountDownLatch、LimitLatch等并发都是由AQS衍生出来…

ElementUI的MessageBox的按钮置灰且不可点击

// this.$confirmthis.$alert(这是一段内容, 标题名称, {confirmButtonText: 确定,confirmButtonCLass: confirmButton,beforeClose: (action,instance,done) > {if (action confirm) {return false} else {done()}});}.confirmButton {background: #ccc !important;cursor…

淘宝API接口的实时数据和缓存数据区别

电商API接口实时数据是指通过API接口获取到的与电商相关的实时数据。这些数据可以包括商品库存、订单状态、销售额、用户活跃度等信息。 通过电商API接口&#xff0c;可以实时获取到电商平台上的各种数据&#xff0c;这些数据可以帮助企业或开发者做出及时的决策和分析。例如&…

16.3.1 【Linux】程序的观察

既然程序这么重要&#xff0c;那么我们如何查阅系统上面正在运行当中的程序呢&#xff1f;利用静态的 ps 或者是动态的 top&#xff0c;还能以 pstree 来查阅程序树之间的关系。 ps &#xff1a;将某个时间点的程序运行情况撷取下来 仅观察自己的 bash 相关程序&#xff1a; p…

安达发APS|APS排产软件之计划甘特图

在当今全球化和竞争激烈的市场环境下&#xff0c;制造业企业面临着巨大的压力&#xff0c;如何在保证产品质量、降低成本以及满足客户需求的同时&#xff0c;提高生产效率和竞争力成为企业需要迫切解决的问题。在这个背景下&#xff0c;生产计划的制定和执行显得尤为重要。然而…

Spring Boot 集成 XXL-JOB 任务调度平台

一、下载xxl-job并使用。 二、将xxl-job集成到springboot里 一、 下载xxl-job并使用。 这一步没完成的请参考这个博客&#xff1a;http://t.csdn.cn/lsp4r 二、将xxl-job集成到springboot里 1、引入依赖 <dependency><groupId>org.springframework.boot</group…

单模光纤模场强度分布以及高斯近似的MATLAB仿真

已知纤芯半径5um&#xff0c;数值孔径NA 0.1&#xff0c;波长 用波长和数值孔径计算归一化常数V 之前我们在单模光纤特征方程及其MATLAB数值求解中&#xff0c;用线性关系拟合过V和W&#xff0c;这里直接用拟合结果 U用V和W计算 clc clear close alla 5e-6;%纤芯半径 NA …

ssm+vue小型企业办公自动化系统源码和论文PPT

ssmvue小型企业办公自动化系统源码和论文PPT013 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xf…

Web服务器项目一

文章目录 是什么HTTP协议——应用层协议服务器基本框架两种高效的处理模式线程池 是什么 Web服务器是一个服务器软件程序&#xff0c;主要功能是通过HTTP协议与客户端&#xff08;通常是浏览器Browser)进行通信&#xff0c;来接收&#xff0c;存储&#xff0c;处理来自客户端的…

npm run xxx 的时候发生了什么?(以npm run dev举例说明)

文章目录 一、去package.json寻找scripts对应的命令二、去node_modules寻找vue-cli-service三、从package-lock.json获取.bin的软链接1. bin目录下的那些软连接存在于项目最外层的package-lock.json文件中。2.vue-cli-service文件的作用3.npm install 的作用 总结 一、去packag…

java springboot驾校管理系统

开发技术&#xff1a; SpringBootspringmvcMybitis-Puls mysql5.x html ajax数据交互 开发工具&#xff1a; idea或eclipse jdk1.8 maven (1) 管理员登陆 (2) 所有学员信息列表查询 &#xff08;3&#xff09;所有学生考试信息 &#xff08;4&#xff09;学员…

Datawhale Django入门组队学习Task01

Task01 一.创建虚拟环境 python -m venv django_learn &#xff08;django_learn那里是自己定的环境名字&#xff09; 之前一直用conda管理虚拟环境&#xff0c;没咋用过virtualenv&#xff0c;然后我的powershell之前也设置了默认启动了base环境&#xff0c;然后输入activat…

目标检测(Object Detection)

文章目录 1. 目标检测1.1 目标检测简要概述及名词解释1.2 IOU1.3 TP TN FP FN1.4 precision&#xff08;精确度&#xff09;和recall&#xff08;召回率&#xff09; 2. 边框回归Bounding-Box regression3. Faster R-CNN3.1 Faster-RCNN&#xff1a;conv layer3.2 Faster-RCNN&…

如何搭建个人邮件服务hmailserver并实现远程发送邮件

文章目录 1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工…