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的选择器 …...
非计算机科班如何丝滑转码?
转码,也就转行为程序员,已成为当今数字化时代的一种重要技能。随着科技的发展,越来越多的人开始意识到掌握编程技能的重要性,而非计算机科班出身的朋友们,想要丝滑转码,也许可以从以下几个方面入手。 一、明…...
亿发创新中医药信息化解决方案,自动化煎煮+调剂,打造智能中药房
传统中医药行业逐步复兴,同时互联网科技和人工智能等信息科技助力中医药行业逐步实现数字化转型。利用互联网、物联网、大数据等科技,实现现代科学与传统中医药的结合,提供智能配方颗粒调配系统、中药自动化调剂系统、中药煎配智能管理系统、…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
