Shell编程之正则表达式与文本三剑客

目录

一、正则表达式

1.引言--什么是正则表达式

1.1正则表达式的功能 

2.基础正则表达式(BRE)

2.1特殊字符 

2.2定位符 

2.3非打印字符

3.扩展正则表达式(ERE)

4.元字符操作的案列

二、命令小工具

1.cut:列截取工具

2.sort排序

3.uniq去重

4.tr删除

三、文本三剑客

1.grep命令

2.sed命令

2.1什么是sed

2.2sed的特点 

2.3sed的原理 

2.4常用的操作选项 

2.4.1打印输出 

2.4.2增加内容

2.4.3删除

2.4.4替换和搜索替换

2.4.5插入文件 

2.4.6另存为到文件 

2.4.7同时编辑 

2.4.8分组操作 

2.4.9读取完退出 

2.4.10sed脚本

3.awk

3.1.概述

3.2工作原理

3.3基本语法 

3.4常用案例 

3.4.1内建变量

3.4.2内置变量

3.4.3其他内置变量

3.5BEGIN、END运算

3.6awk高级用法

3.7awk if语句

3.8BEGIN END循环

3.9awk数组

3.10awk循环 


一、正则表达式

1.引言--什么是正则表达式

正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
正则表达式不只有一种,而且 LINUX 中不同的程序可能会使用不同的正则表达式,如:
工具:grep sed awk egrep 

1.1正则表达式的功能 

(1)正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式
(2)正则表达式是由普通字符与元字符组成
(3)普通字符包括大小写字母、数字、标点符号及一些其他符号
(4)元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

2.基础正则表达式(BRE)

基础正则表达式常见元字符:(支持的工具:grep、egrep、sed、awk)

2.1特殊字符 

特殊字符描述示例及解释
\转义符,将特殊字符进行转义,忽略其特殊意义a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义
^匹配行首^tux匹配以'tux`开头的行
$匹配行尾tux$匹配以tux结尾的行
.匹配除换行符\r\n之外的任意单个字符a.b匹配a和b之间任意一个字符
[list]匹配list列表中的一个字符go[ola]d匹配gold、good、goad,也可以是[a-z]匹配所有小写字母
[^list]匹配任意不在list列表中的一个字符[^a-z]匹配任意非小写字母的字符
*匹配前面子表达式0次或者多次goo*d匹配god、good、gooooood
\{n\}匹配前面的子表达式n次go\{2\}d~匹配good、[0-9]\{2\} 匹配两位数字
\{n,\}匹配前面的子表达式不少于n次go\{2,\}d匹配good、goood等、[0-9]\{2,\}匹配两位及两位以上数字
\{n,m\}匹配前面的子表达式n到m次go\{2,3\}d匹配good、goood、[0-9]\{2,3\}`匹配两位到三位数字

注:egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”

2.2定位符 

^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置

2.3非打印字符

\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符

3.扩展正则表达式(ERE)

通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式

下面举几个例子说明:

+    作用:重复一个或者一个以上的前一个字符

?    作用:零个或者一个的前一个字符 

|    作用:使用或者(or)的方式找出多个字符 

()    作用:查找“组”字符串

()+    作用:辨别多个重复的组 

4.元字符操作的案列

查找特定字符以及反向选择

利用中括号“[]”来查找集合字符以及查找包含重复单个字符 

大小写字母查找"a-z"或"A-Z"以及数字查找

查找行首“^”与行尾字符“$”

“^”符号在元字符集合“[]”符号内外的作用是不一样的 

查找任意一个字符“.”与重复字符“*”

查找连续字符范围“{}” 

二、命令小工具

1.cut:列截取工具

用法:

cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出

如果不指定File参数,cut命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一

选项功能
-b按字节截取
-c按字符截取,常用于中文
-d指定以什么为分隔符截取,默认为制表符
-f通常和-d一起

2.sort排序

是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样

选项功能
-t指定分隔符,默认使用[Tab]吧 键或空格分隔
-k指定排序区域,哪个区间排序
-n按照数字进行排序,默认是以文字形式排序
-u等同于uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
-r反向排序,默认是升序,-r就是降序
-o将排序后的结果转存至指定文件

3.uniq去重

主要用于去除连续的重复行
注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重

选项功能
-c对重复的行进行计数
-d仅显示重复行
-u仅显示出现一次的行

4.tr删除

它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符

选项功能
-d删除字符
-s删除所有重复出现的字符,只保留第一个

cat fruit | tr " ' " '/'

如果想替换单引号则需要用双引号把单引号引起来,反斜杠转义也不行 

三、文本三剑客

1.grep命令

grep [选项]… 查找条件 目标文件

常用选项功能
-E开启扩展(Extend)的正则表达式
-c计算找到 '搜寻字符串' 的次数
-i忽略大小写的不同,所以大小写视为相同
-o只显示被模式匹配到的字符串
-v反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!(反向查找,输出与查找条件不相符的行)
--color=auto可以将找到的关键词部分加上颜色的显示
-n顺便输出行号

2.sed命令

2.1什么是sed

sed命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等

2.2sed的特点 

(1)文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等
(2)可在无交互的情况下实现相当复杂的文本处理操作
(3)被广泛应用于Shel脚本,以完成自动化处理任务
(4)sed依赖于正则表达式

2.3sed的原理 

读入新的一行内容到缓存空间;
从指定的操作指令中取出第一条指令,判断是否匹配 pattern
如果不匹配,则忽略后续的编辑命令,回到第 2 步继续取出下一条指令;
如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第 2 步继续取出下一条指令;
当所有指令都应用之后,输出缓存行的内容;回到第 1 步继续读入下一行内容;
当所有行都处理完之后,结束

2.4常用的操作选项 

sed [ 选项 ] ' 操作 ' 参数
选项功能
-e
进行多次编辑
-n
取消默认输出
-f
指定 sed 文件名
-i
直接在源文件中修改
-r
使用扩展正则表达式
命令动作功能
p
打印输出
d
删除指定行
i
在指定行之前插入内容
a
在指定行后面插入内容
c
替换指定行所有内容
s
搜索替换
2.4.1打印输出 

sed默认不支持扩展正则,如果要支持,需要加-r选项 

2.4.2增加内容

2.4.3删除

2.4.4替换和搜索替换

这里有个注意点:

c指令是整行替换

s指令是关键词替换

常用的选项:
g: 行内全局替换
p: 显示替换成功的行
w: 将替换成功的行保存至文件中
I,i: 忽略大小写

2.4.5插入文件 

2.4.6另存为到文件 

2.4.7同时编辑 

2.4.8分组操作 

2.4.9读取完退出 
正常情况下 sed 会在读取完所有数据行之后退出,但是我们可以随时使用 q 指令来提前退出 sed

2.4.10sed脚本

3.awk

3.1.概述

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作

3.2工作原理

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出
如果没有定义匹配条件默认是匹配所有数据行, awk 隐含循环,条件匹配多少次动作就会执行多少次
逐行读取文本,默认以空格或 tab 键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令
(1)BEGIN 语句设置计数和打印头部信息,在任何动作之前进行
(2)END 语句输出统计结果,在完成动作之后执行
AWK 执行的流程非常简单:读( Read )、执行( Execute )与重复( Repeat

3.3基本语法 

命令格式:
awk   选项   模式或条件 { 操作 }   文件 1 文件 2 ...
awk -f 脚本文件   文件 1   文件 2 ..
格式: awk 关键字   选项   命令部分   '{xxxx}'   文件名
AWK 支持两种不同类型的变量:内建变量 ( 可直接使用 ) ,自定义变量 awk 内置变量(预定义变量)
FS
指定每行文本的字段分隔符,默认为空格或制表位
NF
当前处理的行的字段个数。在执行过程中对应于当前的字段数, NF :列的个数
NR
当前处理的行的行号(序数)在执行过程中对应于当前的行号
$0
当前处理的行的整行内容
$n
当前处理行的第 n 个字段(第 n 列)。比如 : $1 表示第一个字段, $2 表示第二个字段
FILENAME
被处理的文件名 ( 当前输入文件的名)
FNR
各文件分别计数的行号
OFS
输出字段分隔符(默认值是一个空格)
ORS
输出记录分隔符(默认值是一个换行符)
RS
行分隔符(数据记录分隔,默认为 \n ,即每行为一条记录 )

3.4常用案例 

3.4.1内建变量
awk 包含几个特殊的内建变量(可直接用)如下所示
FS
指定每行文本的字段分隔符,默认为空格或制表位
NF
当前处理的行的字段个数
NR
当前处理的行的行号(序数)
$0
当前处理的行的整行内容
$n
当前处理行的第 n 个字段(第 n 列)
FILENAME
被处理的文件名
RS行分隔符(数据记录分隔,默认为\n,即每行为一条记录 )

patterm和' '不会显示任何东西

print:多打印一遍

字符串引用要添加双引号

重定向输出,文件里有多少行就重新输出多少行

3.4.2内置变量
awk 常用内置变量
$1
代表第一列
$2
代表第二列以此类推
$0
代表整行
NF
一行的列数
NR
行数

扩展生产案例:网卡的IP、流量;根分区的可用量

3.4.3其他内置变量
FS
输入字段的分隔符,默认是空格
OFS
输出字段的分隔符,默认也是空格
FNR
读取文件的记录数(行号),从 1 开始,新的文件重新重 1 开始计数
RS
输入行分隔符默认为换行符
ORS
输出行分隔符默认也是为换行符

3.5BEGIN、END运算

逐行执行开始之前执行什么任务,结束之后再执行什么任务,用 BEGIN END
BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
END一般用来做汇总操作,仅在读取完数据记录之后执行一次

模糊匹配,用~表示包含,!~表示不包含  

关于数值与字符串的比较
比较符号: == != <= >= < >

逻辑运算  && ||
&& || 是逻辑运算符,用于组合多个条件并控制程序流程
&& 要求所有条件都为真时才为真,否则为假
|| 只要有一个条件为真就为真,全为假时才为假

3.6awk高级用法

3.7awk if语句

3.8BEGIN END循环

awk 还支持 for 循环、 while 循环、函数、数组等
第一步:运行 BEGIN{ commands } 语句块中的语句
第二步:从文件或标准输入 (stdin) 读取一行。然后运行 pattern{ commands } 语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成
第三步:当读至输入流末尾时,运行 END{ commands } 语句块
(1)BEGIN 语句块在 awk 开始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN 语句块中
(2)END 语句块在 awk 从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END 语句块中完毕,它也是一个可选语句块
(3)pattern 语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供 pattern 语句块,则默认运行{ print } ,即打印每个读取到的行。 awk 读取的每一行都会运行该语句块

3.9awk数组

BEGIN 中的命令只执行一次
awk数组 的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号

3.10awk循环 

筛选日志文件 

总结

grep egrep 文本过滤 ( 更适合单纯的查找或匹配文本 )
sed 流编辑器 实现编辑的 ( 更适合编辑匹配到的文本 )
awk 文本报告生成器 实现格式化文本输出 ( 更适合格式化文本,对文本进行较复杂格式处理 )

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android】使用ViewPager2与TabLayout实现顶部导航栏+页面切换

【Android】使用ViewPager2与TabLayout实现顶部导航栏&#xff0b;页面切换 TabLayout与ViewPager2概述 TabLayout TabLayout 是 Android 支持库中的一个组件&#xff0c;它是 Design 支持库的一部分。TabLayout 提供了一个水平的标签页界面&#xff0c;允许用户在不同的视图…

CogVideo 实测,智谱「清影」AI视频生成,全民免费,连 API 都开放了!

不得不说&#xff0c;AI 视频生成界最近非常火热~ 前有快手「可灵」开放内测&#xff0c;一下子带火了老照片修复&#xff0c;全网刷屏&#xff1a; 怕是你还没拿到内测资格&#xff0c;被称为 “国货之光” 的「可灵」就结束了免费无限量模式。每天只有66点的免费额度&#x…

鸿蒙(API 12 Beta2版)【创建NDK工程】

创建NDK工程 下面通过DevEco Studio的NDK工程模板&#xff0c;来演示如何创建一个NDK工程。 说明 不同DevEco Studio版本的向导界面、模板默认参数等会有所不同&#xff0c;请根据实际工程需要&#xff0c;创建工程或修改工程参数。 通过如下两种方式&#xff0c;打开工程创…

2024-07-27 Unity Excel —— 使用 EPPlus 插件读取 Excel 文件

文章目录 1 前言2 项目地址3 使用方法3.1 写入 Excel3.2 读取 Excel3.3 读写 csv 文件 4 ExcelSheet 代码 1 前言 ​ 前几日&#xff0c;一直被如何在 Unity 中读取 Excel 的问题给困扰&#xff0c;网上搜索相关教程相对古老&#xff08;4、5 年以前了&#xff09;。之前想用 …

【openavis】明厨亮灶算法仓

明厨亮灶算法仓主要用于学校食堂&#xff0c;餐厅等饮食卫生安全监管场景&#xff0c;目前包含的算法如下&#xff1a; 算法类型 算法卡片 明厨亮灶算法仓 老鼠检测 垃圾桶未盖 厨师服检测 厨师帽检测 口罩检测 手套检测 动火离人 1. 算法规格介绍&#xff1a; 算…

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令

本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC&#xff1a;Reduced Instruction Set Computing)&#xff0c;它所用的指令比较简单&#xff0c;有如下特点&#xff1a; ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …

你在找提升效率的解决方案还是追求效果的解决方案

企业在寻求“解决方案”时&#xff0c;最好先想清楚&#xff0c;你是想提升某项工作的效率&#xff0c;还是要改善某项工作的效果&#xff1f; 提升效率的解决方案主要是为了在保证质量的前提下提升某项确定工作的完成速度。以政务解决方案为例&#xff1a;当任何人都能通过移…

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据 &#x1f4da;MT6816相关资料&#xff08;来自商家的相关资料&#xff09;&#xff1a; 资料&#xff1a;https://pan.baidu.com/s/1CAbdLBRi2dmL4D7cFve1XA?pwd8888 提取码&#xff1a;8888&#x1f4cd;驱动代码编写&…

某量JS逆向

https://chat.sensetime.com/wb/chat 目录 一、发起请求 二、观察发现只有入参 __data__ 进行了加密&#xff0c;返回是明文 三、 观察JS调用栈 四、从JS中搜索 __data__ 五、使用XHR对Ajax请求进行断点 六、再次发起请求就会断点拦住请求 七、对XHR入口分析 八、逐个…

【C++】选择结构- 嵌套if语句

嵌套if语句的语法格式&#xff1a; if(条件1) { if(条件1满足后判断是否满足此条件) {条件2满足后执行的操作} else {条件2不满足执行的操作} } 下面是一个实例 #include<iostream> using namespace std;int main4() {/*提示用户输入一个高考分数&#xff0c;根据分…

花几千上万学习Java,真没必要!(二十九)

1、基本数据类型包装类&#xff1a; 测试代码1&#xff1a; package apitest.com; //使用Integer类的不同方法处理整数。 //将字符串转换为整数&#xff08;parseInt&#xff09;和Integer对象&#xff08;valueOf&#xff09;&#xff0c; //将整数转换回字符串&#xff08;…

【计算机网络】DNS命令练习与抓包分析实验

一&#xff1a;实验目的 1&#xff1a;掌握DNS缓存的清除方法&#xff0c;了解DNS缓存的作用和影响。 2&#xff1a;熟悉nslookup和dig等DNS查询工具的使用&#xff0c;理解DNS查询的基本原理和过程。 3&#xff1a;通过抓包和分析&#xff0c;深入了解DNS查询和响应消息的格…

html+css 实现悬浮按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

Python+Flask+MySQL+日线指数与情感指数预测的股票信息查询系统【附源码,运行简单】

PythonFlaskMySQL日线指数与情感指数预测的股票信息查询系统【附源码&#xff0c;运行简单】 总览 1、《股票信息查询系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 程序主页面2.3 个人中心界面2.4 基金详情界面2.5 其他功能贴图 3、下载 总览 自己做的项…

【iOS】——属性关键字

属性关键字的类型 在iOS中属性关键字分为四种类型&#xff1a; 可访问性: readonly ,readwrite原子性 &#xff1a; atomic &#xff0c;nonatomic内存管理 &#xff1a; retain/strong/copy&#xff0c; assign/unsafe_unretained&#xff0c;weak方法命名&#xff1a;sette…

Linux 动静态库

一、动静态库 1、库的理解 库其实是给我们提供方法的实现&#xff0c;如上面的对于printf函数的实现就是在库中实现的&#xff0c;而这个库也就是c标准库&#xff0c;本质也是文件&#xff0c;也有对应的路径 2、区别 静态库是指编译链接时&#xff0c;把库文件的代码全部加入…

前端canvas——赛贝尔曲线

曲线之美&#xff0c;不在于曲线本身&#xff0c;而在于用的人。 所以就有了这期赛贝尔曲线。 新规矩&#xff0c;先上个GIT。 效果图 开局一张图&#xff0c;代码全靠编。 代码 画骨 先想着怎么画一个心形吧&#xff0c;等你想好了&#xff0c;就知道怎么画了。 首先就还…

Cyberchef基础概念之-循环语句操作-Jump/Label

在本专栏的前面的文章介绍了fork,merge,subsection,register等多种概念来解决实际场景的问题。本文将介绍的Jump/Label的操作类似于编程语言中的for和while的功能&#xff0c;相信在学会使用jump操作后&#xff0c;将有助于解决更为复杂的数据处理问题。 本文将详细的介绍该操…

每日OJ_力扣+牛客_另类加法_不用加号的加法

目录 力扣面试题 17.01. 不用加号的加法 解析代码 牛客另类加法 解析代码 力扣面试题 17.01. 不用加号的加法 面试题 17.01. 不用加号的加法 设计一个函数把两个数字相加。不得使用 或者其他算术运算符。 示例: 输入: a 1, b 1 输出: 2提示&#xff1a; a, b 均可能…

OpenSSL学习笔记及在项目中的使用

OpenSSL官方命令手册&#xff1a;OpenSSL commands - OpenSSL Documentation 参考教程&#xff1a; 操作&#xff1a;OpenSSL的基本使用教程(一&#xff09;_openssl.exe使用教程-CSDN博客 操作&#xff1a;Linux和Shell回炉复习系列文章总目录 - 骏马金龙 - 博客园 (cnblog…