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

shell之正则表达式及三剑客grep命令
一、正则表达式概述 什么是正则表达式? 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式,又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 正则表达式 普通字符: 大小写字母…...
LeetCode 热题 100 JavaScript--33. 搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nums[1], …,…...

并发编程 - 线程池中的常见面试题
目录 1. 线程池相比于线程有什么优点 2. 线程池的参数有哪些 3. 线程工厂有什么用 4. 说一下线程的优先级 5. 说一下线程池的执行流程 6. 线程池的拒绝策略有哪些 7. 如何实现自定义拒绝策略 8. 如何判断线程池中的任务是否执行完成 1. 线程池相比于线程有什么优点 有…...
将多个单独的 Excel 文件合并成一个,并添加标题行
要将多个单独的 Excel 文件合并成一个,并添加标题行,可以使用 Python 的 pandas 库。以下是一个示例代码,假设要合并的 Excel 文件都在同一个文件夹中: import os import pandas as pd # 指定文件夹路径 folder_path path/to/fo…...
VPN pptp和l2tp协议破解
代码下载地址: https://download.csdn.net/download/m0_37567738/88215516?spm1001.2014.3001.5501...

4.3、Flink任务怎样读取Kafka中的数据
目录 1、添加pom依赖 2、API使用说明 3、这是一个完整的入门案例 4、Kafka消息应该如何解析 4.1、只获取Kafka消息的value部分 4.2、获取完整Kafka消息(key、value、Metadata) 4.3、自定义Kafka消息解析器 5、起始消费位点应该如何设置 5.1、earliest() 5.2、lat…...

C语言实例_和校验算法
一、算法介绍 和校验(Checksum)是一种简单的纠错算法,用于检测或验证数据传输或存储过程中的错误。它通过对数据进行计算并生成校验和,然后将校验和附加到数据中,在接收端再次计算校验和并进行比较,以确定…...

安全加密框架图——Oracle安全开发者
Oracle安全开发者 ACLs 设计 ACLs(访问控制列表)时,可以根据以下思路进行设计: 所有者文件权限:确定文件的所有者能够对文件执行哪些操作,如读取、写入、执行等。这可以根据文件的性质和拥有者的职责来决…...
Android databinding 被多次定义
一、报错: AndroidStudio运行代码时,编译器报 Type androidx.databinding.Bindable is defined multiple times...... 二、解决: 点击 Build -> Clean Project,关闭编译器再打开即可。 三、解决过程: 在使用Andro…...
云原生周刊:Kubernetes v1.28 新特性一览 | 2023.8.14
推荐一个 GitHub 仓库:Fast-Kubernetes。 Fast-Kubernetes 是一个涵盖了 Kubernetes 的实验室(LABs)的仓库。它提供了关于 Kubernetes 的各种主题和组件的详细内容,包括 Kubectl、Pod、Deployment、Service、ConfigMap、Volume、…...
机器学习之分类模型
机器学习之分类模型 概述分类模型逻辑回归最近邻分类朴素贝叶斯支持向量机决策树随机森林多层感知机基于集成学习的分类模型VotingBaggingStackingBlendingBoosting 概述 机器学习分类模型通过训练集进行学习,建立一个从输入空间 X X X到输出空间 Y Y Y(…...
学习Vue:创建第一个Vue实例
当您开始探索 Vue.js,第一步就是创建一个 Vue 实例。Vue 实例是 Vue.js 应用程序的核心构建块,它使您能够将数据与用户界面连接起来,实现动态交互。在本文中,我们将详细介绍如何创建您的第一个 Vue 实例。 步骤1:引入 …...

JavaFx基础学习【二】:Stage
一、介绍 窗口Stage为图中标绿部分: 实际为如下部分: 不同的操作系统表现的样式不同,以下都是以Windows操作系统为例,为了使大家更清楚Stage是那部分,直接看以下图,可能更清楚: 有点潦草&…...

C语言——动态内存函数(malloc、calloc、realloc、free)
了解动态内存函数 前言:一、malloc函数二、calloc函数三、realloc函数四、free函数 前言: 在C语言中,动态内存函数是块重要的知识点。以往,我们开辟空间都是固定得,数组编译结束后就不能继续给它开辟空间了࿰…...

Redis数据结构——Redis简单动态字符串SDS
定义 众所周知,Redis是由C语言写的。 对于字符串类型的数据存储,Redis并没有直接使用C语言中的字符串。 而是自己构建了一个结构体,叫做“简单动态字符串”,简称SDS,比C语言中的字符串更加灵活。 SDS的结构体是这样的…...

【计算机网络】TCP协议超详细讲解
文章目录 1. TCP简介2. TCP和UDP的区别3. TCP的报文格式4. 确认应答机制5. 超时重传6. 三次握手7. 为什么两次握手不行?8. 四次挥手9. 滑动窗口10. 流量控制11. 拥塞控制12. 延时应答13. 捎带应答14. 面向字节流15. TCP的连接异常处理 1. TCP简介 TCP协议广泛应用于可靠性要求…...
Salesforce特别元数据部署技巧
标准的picklist字段部署 <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <Package xmlns"http://soap.sforce.com/2006/04/metadata"><types><members>Opportunity.StageName</members><…...
[前端系列第2弹]CSS入门教程:从零开始学习Web页面的样式和布局
在这篇文章中,我将介绍CSS的基本概念、语法、选择器、属性和值,以及如何使用它们来定义Web页面的外观和布局。还将给一些简单而实用的例子,可以跟着我一步一步地编写自己的CSS样式表。 目录 一、什么是CSS 二、CSS的语法 三、CSS的选择器 …...

非计算机科班如何丝滑转码?
转码,也就转行为程序员,已成为当今数字化时代的一种重要技能。随着科技的发展,越来越多的人开始意识到掌握编程技能的重要性,而非计算机科班出身的朋友们,想要丝滑转码,也许可以从以下几个方面入手。 一、明…...

亿发创新中医药信息化解决方案,自动化煎煮+调剂,打造智能中药房
传统中医药行业逐步复兴,同时互联网科技和人工智能等信息科技助力中医药行业逐步实现数字化转型。利用互联网、物联网、大数据等科技,实现现代科学与传统中医药的结合,提供智能配方颗粒调配系统、中药自动化调剂系统、中药煎配智能管理系统、…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...