shell - 正则表达式和grep命令和sed命令
一.正则表达式概述
1.正则表达式定义
1.1 定义
- 使用字符串描述、匹配一系列符合某个规则的字符串
1.2 了解
- 普通字符: 大小写字母、数字、标点符号及一些其它符号
- 元字符: 在正则表达式中具有特殊意义的专用字符
1.3 层次分类
- 基础正则表达式
- 扩展正则表达式
- 编程语言支持的高级正则表达式
1.4 linux三剑客(grep sed awk)支持的正则表达式
- shell是不支持正则表达式的(shell支持的是通配符)。shell中的正则表达式只有个别命令支持的,一般常用的是Linux三剑客
| 支持正则的shell命令 | 正则类型 |
|---|---|
| grep | 默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符) |
| egrep 或 grep -E | 使用扩展的正则表达式(ERE) |
| sed | 默认使用基本正则表达式(BRE) |
| awk | 使用扩展正则表达式(ERE) |
2.基础正则表达式的元字符
基础正则表达式是常用的正则表达式部分
| \ | 表示转义字符,去掉特殊符号的特殊含义 |
| . | 匹配任意单个字符 |
| ^ | 匹配字符串开头的位置 |
| $ | 匹配字符串末尾的位置 |
| * | 匹配前面的字符出现0~+∞ |
| [list] | 匹配list列表中的一个字符(列表中只要有一个符合即可) |
| [^list] | 匹配任意非list列表中的一个字符 |
| {n} | 匹配前面的子表达式n次 |
| {n,} | 匹配前面的子表达式最少n次 |
| {,n} | 匹配前面的子表达式最多n次 |
| {n,m} | 匹配前面的子表达式n到m次 |
| [ ] | 代表单个字符 |
| \? | 1次或0次 |
| ^$ | 空行 |
| .* | 1~+∞ |
2.1 转义字符的运用
2.1.1 将特殊含义的字符转换为普通字符的含义
| 被转义的特殊字符 | 转义前的含义作用 |
| \ = | 具有赋值的作用,或则进行字符判断 |
| \ ! | 取反 |
| \ & | 单个&符可以将命令挂在后台上,两个是逻辑符号且的作用 |
| \ $ | 取值变量的作用 |
2.1.2 将普通字符转换为特殊作用的字符
| 被赋予新含义的普通字符 | 现在拥有的作用 |
| \n | 换行 |
| \t | 转化为制表符 |
| \w(小写) | 匹配包括下划线的任何单词字符 |
| \W(大写) | 匹配任何非单词字符。等通于"[^A-Za-z0-9_]" |
| \r | 转换后是回车符 |
| \d | 匹配一个数字字符 |
| \D | 匹配一个非数字字符。等价于[^0-9] |
| \s(小写) | 空白符 |
| \S(大写) | 非空白符 |
2.1.3 中括号表达式
普通中括号包围的字符组,表示某个单个字符匹配中括号内的任意字符即匹配成功
- x[abc]z : 可以匹配包含“xaz”、“xbz”、“xcz”的字符串
- 取反表示法: 中括号内开头使用 ^ ,表示只要不是中括号内的字符就匹配
x[ ^abc]z : 可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串
特殊元字符在中括号中匹配
- 想要在中括号中匹配: ^ ,需要将其放在 中括号非开头的位置 ,如:[a^]
- 想要在中括号中匹配: - ,需要将其放在 开头位置或结尾位置 ,如:[abc-]、[-abc]
- 想要在中括号中匹配: ] ,需要将其放在 开头位置 ,如:[]abc]
2.1.4 位置匹配
只匹配字符,不匹配字符
- ^ : 匹配行首
- $ : 匹配行尾
- \b 匹配单词边界处的位置(开头和结尾) \bword\b 等价于 \<word\>
- \< 匹配单词开头处的位置
- \> 匹配单词结尾处的位置
- \B 匹配非单词边界处的位置
2.1.5 字符类
| [:alnum:] | 字母和数字 |
| [:alpha:] | 代表任何英文大小写字母 A-Z a-z |
| [:lower:] | 小写字母 |
| [:upper:] | 大写字母 |
| [:blank:] | 空白字符 |
| [:space:] | 包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广 |
| [:cntrl:] | 不可打印的控制字符(退格、删除、警铃...) |
| [:digit:] | 十进制数字 |
| [:xdigit:] | 十六进制数字 |
| [:graph:] | 可打印的非空白字符 |
| [:print:] | 可打印字符 |
| [:punct:] | 标点符号 |
2.1.6 量词
\{m\} : 表示匹配前一个字符或前一个子表达式m次
-
\{m,n\} : (m<n)表示匹配前一个字符或前一个字表达式最少m次,最多n次
-
\{m,\} : 表示匹配前一个字符或前一个子表达式至少m次
-
\{,n\} : 表示匹配前一个字符或前一个字表达式最多n次(匹配0次也算是成功)
-
* 表示前一个字符或前一个子表达式匹配0次或多次,等价于:{0,}
- .* 匹配任意长度的任意字符
3.扩展正则表达式的元字符
支持awk和egrep使用,如果grep和sed想要正常使用(grep -E sed -r)
| 元字符 | 作用含义 |
| + | 匹配前面子表达式1次及以上 |
| ? | 匹配前面子表达式0次或者1次 |
| () | 将括号中的字符串作为一个整体 |
| | | 以"或"的方式匹配字符串 |
3.1 扩展常用的量词
- + 表示匹配前一个字符或前一个子表达式1或多次,即至少一次 等价于 {1, }
- ? 表示匹配前一个字符或前一个子表达式0或1次,等价于 {0,1} 等价于 {,1}
3.2 分组捕获和反向引用
使用小括号()包围一部分正则表达式,这部分正则表达式即成为一个分组整体,也称为一个子表达式。
分组后可以使用 \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 [options] pattern [file]options表示:选项; pattern 表示:匹配的的表达式; file 表示:文件名例如:grep -i "root" /etc/passwd
2.常用选项
| -m 数字 | 匹配到数字行停止 |
| -v | 取反 |
| -i | 忽略字符大小写 |
| -n | 显示匹配的行号 |
| -c | 统计匹配的行数 |
| -o | 仅显示匹配到的字符串 |
| -q | 静默模式,不输出任何信息 |
| -A 数字 | after 后数字行 |
| -B 数字 | before 前数字行 |
| -C 数字 | context 前后各数字行 |
| -e | 实现多个选项间的逻辑 or 关系 |
| -E | 使用ERE,相当于egrep |
| -w | 匹配整个单词 |
| -F | 不支持正则表达式,相当于fgrep |
| -f | 处理两个文件相同内容,把第一个文件作为匹配条件 |
| -r | 递归目录,但不处理软连接 开始搜索目录 |
| -R | 递归目录,但处理软连接 |
操作:
-m

-i

-n

-c

-o

-q

-A -B -C



-e

-w

-E

-r
![]()
3.操作
① 统计当前主机的连接状态

② 统计当前连接主机数

③ 匹配QQ号

④ 匹配电话号码

⑤ 匹配邮箱

⑥ 统计 /etc/fstab 下面有多少单词

三.sed命令
1.关于sed
1.1 简介
sed 是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得 sed 性能很高,sed 在读取大文件时不会出现卡顿的现象。如果使用 vi 命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为 vi 命令打开文件是一次性将文件加载到内存,然后再打开。sed 就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。
1.2 sed 编辑器的工作过程
sed 的工作流程主要包括读取、执行和显示三个过程:

- 读取: sed 从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
- 执行: 默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
- 显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完。
注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用 "sed -i" 修改源文件、或使用重定向输出到新的文件中。
1.3 玛玛哈哈
怎么解决 sed 命令处理容量过大,或内容过多而导致执行效率缓慢的问题?
方案一:
使用 split 命令进行文件分割(如果文件是百万行的,那么我们就创建一个单独的目录,将文件分割为一百个一万行的文本),再使用 sed 命令进行处理,除了使用 split 分割,也可以使用一个遍历分割shell脚本进行执行。
方案二:
cat 文件名 | sed 处理 (这个方案只能针对中型的文件文本,如果文本量过大,处理效果不好)
2.sed 命令与选项操作符
1. 格式
sed [option]... 'script;script;...' [input file...]选项 自身脚本语法 支持标准输入管道
2.常用选项
| -e | 用指定命令或者脚本来处理输入的文本文件 只有一个操作命令时省略,一般在执行多个操作命令使用 |
| -f | 用指定的脚本文件来处理输入的文本文件 |
| -n | 不输出模式空间内容到屏幕,即不自动打印 可以与 p 命令一起使用完成输出 |
| -r -E | 使用扩展正则表达式 |
| -h | 显示帮助 |
| -i | 直接修改目标文件 |
| -i.xxx | 备份文件并原处编辑 |
| -s | 将多个文件视为独立文件,而不是单个连续的长文件流 |
3.操作符
“操作”用于指定文件对操作的动作行为,也就是 sed 的命令。
通常情况下是采用的 “[n1[,n2]]” 操作参数的格式。n1、n2是可选的,代表选择进行操作的行数,如操作需要在5~20行之间进行,则表示为 “5,20 动作行为”
| s | 替换,替换指定字符 |
| d | 删除,删除选定的行 |
| a | 增加,在当前行下方增加一行指定内容 |
| i | 插入,在选定行上方插入一行指定内容 |
| c | 替换,将选定行替换为指定内容 |
| w | 保存模式匹配的行至指定文件 |
| r | 读取指定文件的文本至模式空间中匹配的行后 |
| y | 字符转换,转换前后的字符长度必须相同 |
| p | 打印行内容。如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用 |
| = | 打印行号 |
| l(小写L) | 打印数据流中的文本和不可打印的ASCII字符(如结束符$ 制表符\t) |
操作:







显示第二行内容

4.脚本格式
由 ‘地址+命令’ 组成
① 不给地址 对全文进行处理
② 单地址
数字 指定的数字行
$ 最后一行
③ 地址范围
x,x 从第x行到第x行 3,6 从第3行到第6行
x,+x 从x行到+x行 3,+4 从3行到第7行
/pat1/,/pat2/ 第一个正则表达式和第二个正则表达式之间的行
④ 步进 ~
1~2 奇数行
2~2 偶数行
n;打印下一行

操作:




小问题:
如何打印一段时间间的日志

5.搜索替代
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中& 指代之前找到的内容

指代变量

分组替换
sed -nr 's/正则匹配/\1/p'

还可以变换顺序

操作:
取ip
①

②

或者
提取版本号


提取0644

6.变量


修改端口


修改网卡名


相关文章:
shell - 正则表达式和grep命令和sed命令
一.正则表达式概述 1.正则表达式定义 1.1 定义 使用字符串描述、匹配一系列符合某个规则的字符串 1.2 了解 普通字符: 大小写字母、数字、标点符号及一些其它符号元字符: 在正则表达式中具有特殊意义的专用字符 1.3 层次分类 基础正则表达式扩展正…...
datawhale 大模型学习 第十二章-大模型环境影响
环境影响概述 气候变化:大语言模型(LLM)的训练和运行需要大量计算资源,导致显著的能源消耗和温室气体排放,加剧气候变化。能源消耗:训练LLM的计算过程消耗大量电力,间接增加了化石燃料的使用&a…...
Qt WebEngine模块使用(开发环境安装和程序开发)
一、Qt WebEngine Qt WebEngine_hitzsf的博客-CSDN博客 Qt WebEngine模块提供了一个Web浏览器引擎,可以轻松地将万维网上的内容嵌入到没有本机Web引擎的平台上的Qt应用程序中。Qt WebEngine提供了用于渲染HTML,XHTML和SVG文档的C 类和QML类型ÿ…...
网络体系结构 和网络原理之UDP和TCP
目录 网络分层 一. 应用层 http协议 二. 传输层 1. 介绍 2.UDP协议 (1)组成 (2)细节 3.TCP协议 (1)特性如下链接: (2)组成 (3)特点 三. 网络层 四. 数据链路层 1.介绍 2.以太网协议 3.mac地址和ip地址 五. 物理层 DNS 网络分层 一. 应用层 应用程序 现成的…...
将Android APP安装到sm8550 HDK的NVMe SSD
APP存储路径 在Android中,App在运行过程中主要访问的数据路径通常包括以下几个方面: 内部存储(Internal Storage):App会访问其私有的内部存储空间,这个空间通常位于: /data/data/<package…...
(Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
国家青藏高原科学数据中心下载中国1千米分辨率逐日全天候地表土壤水分数据集(2003-2022) 问题:数据在arcgis打开特别大,无法和矢量数据重合,没有设置地理坐标系 数据在网站上提供了投影信息,提示可以进行py…...
Linux:进度条的创建
目录 使用工具的简单介绍: \r : fflush : 倒计时的创建: 倒计时的工作原理: 进度条的创建: 不同场景下、打印任意长度的进度条: main .c procbor.c 测试效果: 使用工具…...
treeview
QML自定义一个TreeView,使用ListView递归 在 Qt5 的 QtQuick.Controls 2.x 中还没有 TreeView 这个控件(在 Qt6 中出了一个继承自 TableView 的 TreeView),而且 QtQuick.Controls 1.x 中的也需要配合 C model 来自定义,…...
Android开发中自定义View实现RecyclerView下划线
本篇文章主要讲解的是有关RecyclerView下划线的使用,主要有几个方法,具体如下: 第一种方式:网格分割线 public class GridDivider extends RecyclerView.ItemDecoration { private Drawable mDividerDarwable; private i…...
MySQL前百分之N问题--percent_rank()函数
PERCENT_RANK()函数 PERCENT_RANK()函数用于将每行按照(rank - 1) / (rows - 1)进行计算,用以求MySQL中前百分之N问题。其中,rank为RANK()函数产生的序号,rows为当前窗口的记录总行数 PERCENT_RANK()函数返回介于 0 和 1 之间的小数值 selectstudent_…...
【高效开发工具系列】Wolfram Alpha
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
分享7种SQL的进阶用法
推荐一款ChatGPT4.0国内站点,每日有免费使用额度,支持PC、APP、VScode插件同步使用 SQL(Structured Query Language)是一种强大的数据库查询和操作语言,它用于与关系数据库进行交互。随着数据的不断增长和应用需求的日益复杂,掌握SQL的进阶用法对于数据库管理员、数据分析…...
protobuf-go pragma.go 文件介绍
pragma.go 文件 文件位于: https://github.com/protocolbuffers/protobuf-go/blob/master/internal/pragma/pragma.go 该文件核心思想: 利用 Golang 语法机制,扩展 Golang 语言特性 目前,该文件提供以下 4 个功能: …...
C#设置程序开机启动
1:获取当前用户: System.Security.Principal.WindowsIdentity identity System.Security.Principal.WindowsIdentity.GetCurrent();System.Security.Principal.WindowsPrincipal principal new System.Security.Principal.WindowsPrincipal(identity);…...
爱可声助听器参与南湖区价值百万公益助残捐赠活动成功举行
“声音大小合适吗?能听清楚吗?”今天下午,一场助残捐赠活动在南湖区凤桥镇悄然举行,杭州爱听科技有限公司带着验配团队和听力检测设备来到活动现场,为南湖区听障残疾人和老人适配助听器。 家住余新镇的75岁的周奶奶身体…...
SpringBoot 实现定时任务
在项目我们会有很多需要在某一特定时刻自动触发某一时间的需求,例如我们提交订单但未支付的超过一定时间后需要自动取消订单。 定时任务实现的几种方式: Timer:java自带的java.util.Timer类,使用这种方式允许你调度一个java.util…...
将Vue2中的console.log调试信息移除
前端项目构建生产环境下的package时,咱们肯定要去掉development环境下的console.log,如果挨个注释可就太费劲了,本文介绍怎么使用 babel-plugin-transform-remove-console 移除前端项目中所有的console.log. 1. 安装依赖 npm install babel-…...
EMC设计检查建议,让PCB layout达到最佳性能
EMC:Electro Magnetic Compatibility的简称,也称电磁兼容,各种电气或电子设备在电磁环境复杂的共同空间中,以规定的安全系数满足设计要求的正常工作能力。 本章对于 RK3588产品设计中的 ESD/EMI防护设计及EMC的设计检查给出了建议…...
常用抓包软件集合(Fiddler、Charles)
1. Fiddler 介绍:Fiddler是一个免费的HTTP和HTTPS调试工具,支持Windows平台。它可以捕获HTTP和HTTPS流量,并提供了丰富的调试和分析功能。优点:易于安装、易于使用、支持多种扩展、可以提高开发效率。缺点:只支持Wind…...
C++入门(一)— 使用VScode开发简介
文章目录 C 介绍C 擅长领域C 程序是如何开发编译器、链接器和库编译预处理编译阶段汇编阶段链接阶段 安装集成开发环境 (IDE)配置编译器:构建配置配置编译器:编译器扩展配置编译器:警告和错误级别配置编译器࿱…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

