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, }
  • ?  表示匹配前一个字符或前一个子表达式01次,等价于 {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

扩展正则中这些元字符可直接使用: ? + { } | ( )
基础正则中这些元字符前需要加反斜线转义: \? \+ \{ \} \| \( \)
grep sed  默认使用基础正则表达式
grep -E sed -r egrep awk 扩展正则表达式

-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.变量

修改端口

修改网卡名

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

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

相关文章

《机器人SLAM导航核心技术与实战》第1季:第7章_SLAM中的数学基础

视频讲解 【第1季】7.第7章_SLAM中的数学基础-视频讲解 【第1季】7.1.第7章_SLAM中的数学基础_SLAM发展简史-视频讲解 【第1季】7.2.第7章_SLAM中的数学基础_SLAM中的概率理论-视频讲解 【第1季】7.3.第7章_SLAM中的数学基础_估计理论-视频讲解 【第1季】7.4.第7章_SLAM中的…

我用Rust开发Rocketmq name server

我是蚂蚁背大象(Apache EventMesh PMC&Committer)&#xff0c;文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm&#xff0c;文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com 1. Rocketmq-rust namesrv概述 经过一个多月的开发&#xff0c;终…

ssm学生选课系统

学生选课系统&#xff0c;java项目&#xff0c;ssm项目&#xff0c;增删改查均已实现。eclipse和idea都能打开运行。 系统分为3部分学生选课管理&#xff0c;教师管理&#xff0c;管理员管理 主要功能&#xff1a; 管理员&#xff1a;课程管理、学生管理、教师管理 教师&am…

Unity打包Android,jar文件无法解析的问题

Unity打包Android&#xff0c;jar无法解析的问题 介绍解决方案总结 介绍 最近在接入语音的SDK时&#xff0c;发现的这个问题. 当我默认导入这个插件的时候&#xff0c;插件内部的文件夹&#xff08;我下面话红框的文件夹&#xff09;名字原本为GCloudVoice&#xff0c;这时候我…

利用Python中的集合去除列表中重复的元素

题目描述 已知列表li_one[1,2,1,2,3,5,4,3,5,7,4,7,8]&#xff0c;编写程序实现删除列表li_one中重复数据的功能。 分析 集合的特点是集合内元素无序性&#xff0c;集合内元素不可重复&#xff0c;因此可以利用不可重复的特性来解决该问题。 程序代码 li_one[1,2,1,2,3,5,…

Day01-变量和数据类型课后练习-参考答案

文章目录 1、输出你最想说的一句话&#xff01;2、定义所有基本数据类型的变量和字符串变量3、用合适类型的变量存储个人信息并输出4、定义圆周率PI5、简答题 1、输出你最想说的一句话&#xff01; 编写步骤&#xff1a; 定义类 Homework1&#xff0c;例如&#xff1a;Homewo…

已实现:vue、h5项目如何使用echarts实现雷达图、六边形图表

说实话&#xff0c;要说图表里&#xff0c;最强的应该属于echarts了&#xff0c;不管是接入难度上&#xff0c;还是样式多样性上&#xff0c;还有社区庞大程度上&#xff0c;都是首屈一指的&#xff0c;反观有的人习惯用chart.js了&#xff0c;这个无可厚非&#xff0c;但是如果…

elementui中的tree自定义图标

需求&#xff1a;实现如下样式的树形列表 自定义树的图标以及点击时&#xff0c;可以根据子级的关闭&#xff0c;切换图标 <el-tree :data"treeList" :props"defaultProps"><template #default"{ node, data }"><span class&quo…

校园圈子论坛系统--APP小程序H5,前后端源码交付,支持二开!uniAPP+PHP书写!

随着移动互联网的快速发展&#xff0c;校园社交成为了大学生们日常生活中重要的一部分。为了方便校园内学生的交流和互动&#xff0c;校园社交小程序逐渐走入人们的视野。本文将探讨校园社交小程序的开发以及其带来的益处。 校园社交小程序的开发涉及许多技术和设计方面。首先&…

一进一出超薄 V/F(I/F)频率脉冲信号转换器

一进一出超薄 V/F(I/F)频率脉冲信号转换器特点&#xff1a; ◆低成本,超薄设计,国际标准DIN35导轨安装 ◆三端隔离(输入、输出、工作电源间相互隔离) ◆高精度等级(0.1% F.S&#xff0c;0.2% F.S) ◆高线性度(0.1% F.S) ◆高隔离耐压(3000VDC/60S) ◆极低温度漂移(80PPM/℃) ◆…

LLM之makeMoE:makeMoE的简介、安装和使用方法、案例应用之详细攻略

LLM之makeMoE&#xff1a;makeMoE的简介、安装和使用方法、案例应用之详细攻略 目录 makeMoE的简介 1、对比makemore 2、相关代码文件 makMoE_from_Scratch.ipynb文件 makeMoE_Concise.ipynb文件 makeMoE的安装和使用方法 1、基于Databricks使用单个A100进行开发 makeM…

2024年新提出的算法:(凤头豪猪优化器)冠豪猪优化算法Crested Porcupine Optimizer(附Matlab代码)

本次介绍一种新的自然启发式元启发式算法——凤头豪猪优化器(Crested Porcupine Optimizer&#xff0c;CPO)。该成果于2024年1月发表在中科院1区SCI top期刊Knowledge-Based Systems&#xff08;IF 8.8&#xff09;上。 1、简介 受到凤头豪猪&#xff08;CP&#xff09;各种…

qt学习:Table widget控件

目录 头文件 实战 重新配置ui界面 添加头文件 在构造函数中添加初始化 显示方法 该实例是在sqlite项目上添加qt学习&#xff1a;QTSQL连接sqlite数据库增删改查-CSDN博客 头文件 #include <QTableWidgetItem> 实战 重新配置ui界面 用法介绍&#xff0c;可以双击…

Web3技术革新:重新定义在线体验

互联网的不断演进塑造了我们的数字生活&#xff0c;而Web3技术的涌现正带来一场前所未有的变革。本文将深入探讨Web3技术的创新&#xff0c;以及它如何重新定义和提升我们的在线体验。 Web3技术的基本概念 Web3是互联网的第三个时代&#xff0c;它将去中心化、区块链、智能合约…

计算机二级C语言公共基础知识

数据结构和算法 一 算法 算法是指对解决方案准确而完整的描述&#xff0c;简单的说&#xff0c;算法就是解决问题的操作步骤&#xff08;有一个很著名的公式 “程序数据结构算法”&#xff09; 算法不等于数学上的计算方法&#xff0c;也不等于程序&#xff08;程序可以描述…

Datawhale 组队学习之大模型理论基础Task9 大模型法律

第11章 大模型法律 11.1 简介 此内容主要探讨法律对大型语言模型的开发和部署有何规定。 先看看法律的特点&#xff1a; 法律就如我国法律教材所给出的一样&#xff0c;有依靠国家强制力保证实施的特点。 而法律在大模型中也是不可或缺的&#xff0c;缺少了法律的约束&…

使用Hutool工具包解析、生成XML文件

说明&#xff1a;当我们在工作中需要将数据转为XML文件、或者读取解析XML文件时&#xff0c;使用Hutool工具包中的XMLUtil相关方法是最容易上手的方法&#xff0c;本文介绍如何使用Hutool工具包来解析、生成XML文件。 开始之前&#xff0c;需要导入Hutool工具包的依赖 <de…

通过Demo学WPF—数据绑定(一)✨

前言✨ 想学习WPF&#xff0c;但是看视频教程觉得太耗时间&#xff0c;直接看文档又觉得似懂非懂&#xff0c;因此想通过看Demo代码文档的方式进行学习。 准备✨ 微软官方其实提供了WPF的一些Demo&#xff0c;地址为&#xff1a;microsoft/WPF-Samples: Repository for WPF …

MySQL:MVCC原理详解

MySQL是允许多用户同时操作数据库的&#xff0c;那么就会出现多个事务的并发场景。那么再并发场景会出现很多问题&#xff1a;脏读、不可重复读、幻读的问题。 而解决这些问题所用到的方法就是&#xff1a;MVCC 多版本并发控制。而这个MVCC的实现是基于read_view、undoLog 如…

Linux部署lomp环境,安装typecho、WordPress博客

部署lomp环境&#xff0c;安装typecho、WordPress博客 一、环境要求1.1.版本信息1.2.准备阿里云服务器【新用户免费使用三个月】1.3.准备远程工具【FinalShell】 二、Linux下安装openresty三、Linux下安装Mysql四、安装Apache【此步骤可省略】4.1.安装Apache服务及其扩展包4.2.…