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的选择器 …...

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

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

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...