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

一、正则表达式概述

什么是正则表达式?

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

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不支持(加\)支持不支持(加\)支持
|交替匹配| 两边的任意一项不支持(加\)支持不支持(加\)支持

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】K8S存储卷:PV、PVC详解

目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;ku…

ReBel 论文学习笔记

论文&#xff1a;《Combining Deep Reinforcement Learning and Search for Imperfect-Information Games》 地址&#xff1a;https://arxiv.org/abs/2007.13544v2 代码&#xff1a;https://github.com/facebookresearch/rebel 材料&#xff1a; BV1gt4y1k77C&#xff08;1小时…

Linux 当fork在for循环中的问题

以下代码会打印几个"A"&#xff1f; 例1.代码如下&#xff1a; int main(int argc, char* argv[],char* envp[]) { for(int i 0;i < 2; i ) { fork(); printf("A\n"); } exit(0); } 代码分析&#xff1a; //父进程for(int i …

算法笔试 java 输入输出练习

在线编程题刷题训练 所有答案 scancer函数的用法 输入输出总结top&#xff01;&#xff01;&#xff01;&#xff01; java如何调用函数&#xff08;方法&#xff09; java刷acm的各种输入输出 vscode配置java环境 子函数的调用&#xff0c;直接定义一个static子函数调用就…

gin的占位符:和通配符*

1、用法 在 Gin 路由中&#xff0c;可以使用一个通配符&#xff08;*&#xff09;或一个占位符&#xff08;:&#xff09;来捕获 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…

编译OpenCV问题解决:已经编译OpenCV成功之后无法运行测试代码

报错问题如下&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2001 无法解析的外部符号 "void __cdecl cv::imshow(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class c…

【校招VIP】测试计划之黑盒测试白盒测试

考点介绍&#xff1a; 黑盒测试&白盒测试是大厂和三四线公司校招的必考点。黑盒是以结果说话&#xff0c;白盒往往需要理解实现逻辑。现在商业项目的接口测试往往以白盒为主&#xff0c;也就是需要测试同学自己观察和修改数据库的值进行用例的测试。 但是无论采用哪种测试方…

自然语言处理: 第七章GPT的搭建

自然语言处理: 第七章GPT的搭建 理论基础 在以transformer架构为框架的大模型遍地开花后&#xff0c;大模型的方向基本分成了三类分别是: decoder-only架构 , 其中以GPT系列为代表encoder-only架构&#xff0c;其中以BERT系列为代表encoder-decoder架构&#xff0c;标准的tr…

关于Java中synchronized的实现原理

并发编程的三个理念 原子性&#xff1a;一个操作要么全部完成&#xff0c;要么全部失败。可见性&#xff1a;当一个线程对共享变量进行修改后&#xff0c;其他线程也应立刻看到。有序性&#xff1a;程序按照顺序执行 synchronized基本使用 修饰静态方法&#xff0c;锁的是类…

时序预测 | Matlab实现基于RF随机森林的电力负荷预测模型

文章目录 效果一览基本介绍模型描述源码设计学习小结参考资料效果一览 基本介绍 时序预测 | Matlab实现基于RF随机森林的电力负荷预测模型 电力负荷预测是指通过对历史电力负荷数据分析,来预测未来某个时间段内的电力负荷需求。这项预测对于电力系统的运行和调度至关重要,可以…

【Echart地图】jQuery+html5基于echarts.js中国地图点击弹出下级城市地图(附完整源码下载)

文章目录 写在前面涉及知识点实现效果1、实现中国地图板块1.1创建dom元素1.2实现地图渲染1.3点击地图进入城市及返回 2、源码分享2.1 百度网盘2.2 123云盘2.3 邮箱留言 总结 写在前面 这篇文章其实我主要是之前留下的一个心结&#xff0c;依稀记得之前做了一个大屏项目的时候&…

【Sklearn】基于决策树算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于决策树算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理1.1 模型原理1.2 数学模型 2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 决策树是一种基于树状结构的分类和回归模型&#xff0c;它通过一系列…

C++ QT(一)

目录 初识QtQt 是什么Qt 能做什么Qt/C与QML 如何选择Qt 版本Windows 下安装QtLinux 下安装Qt安装Qt配置Qt Creator 输入中文配置Ubuntu 中文环境配置中文输入法 Qt Creator 简单使用Qt Creator 界面组成Qt Creator 设置 第一个Qt 程序新建一个项目项目文件介绍项目文件*.pro样式…

【网络】传输层——UDP | TCP(协议格式确认应答超时重传连接管理)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 现在是传输层&#xff0c;在应用层中的报文(报头 有效载荷)就不能被叫做报文了&#xff0c;而是叫做数…

【Sklearn】基于最中心分类器算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于最中心分类器算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 最近中心分类器&#xff08;Nearest Centroid Classifier&#xff09;也被称为近似最近邻…

若依框架浅浅介绍

由若依官网所给介绍可知 1、文件结构介绍 在ruoyi-admin的pom.xml文件中引入了ruoyi-framework、ruoyi-quartz和ruoyi-generatior模块&#xff0c;在ruoyi-framework的pom.xml文件中引入了ruoyi-system模块。 2、技术栈介绍 前端&#xff1a;Vue、Element UI后端&#xff1a…

xxljob搭建(内网穿透)

调度中心搭建 先从码云或者github上将项目拷贝到本地&#xff0c;选择最新的release分支拷贝下来的xxl-job-admin模块就是调度中心&#xff0c;我们需要做的有两点&#xff0c;第一点将doc/db/tables_xxl_job.sql执行&#xff0c;第二点修改xxl-job-admin的application.proper…

SAP Fiori 将GUI中的自开发报表添加到Fiori 工作台

1. 首先我们在workbench 中开发一个GUI report 这里我们开发的是一个简单的物料清单报表 2. 分配一个事务代码。 注意这里的SAP GUI for HTML 要打上勾 3. 创建语义对象&#xff08; Create Semantic Object&#xff09; 事物代码&#xff1a; path: SAP NetWeaver ->…

2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

文章目录 写在前面步骤打开CSDN质量分页面粘贴查询文章url按F12打开调试工具&#xff0c;点击Network&#xff0c;点击清空按钮点击查询是调了这个接口https://bizapi.csdn.net/trends/api/v1/get-article-score用postman测试调用这个接口&#xff08;不行&#xff0c;认证不通…

React源码解析18(6)------ 实现useState

摘要 在上一篇文章中&#xff0c;我们已经实现了函数组件。同时可以正常通过render进行渲染。 而通过之前的文章&#xff0c;beginWork和completeWork也已经有了基本的架子。现在我们可以去实现useState了。 实现之前&#xff0c;我们要先修改一下我们的index.js文件&#x…