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.rhkb.cn/news/384644.html

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

相关文章

请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理

BeanPostProcessor的postProcessBeforeInitialization方法是在bean的依赖注入&#xff08;即属性填充&#xff09;完成后&#xff0c;但在bean的初始化回调&#xff08;如PostConstruct注解的方法或InitializingBean接口的afterPropertiesSet方法&#xff09;之前被调用的。 具…

大数据管理中心设计规划方案(可编辑的43页PPT)

引言&#xff1a;随着企业业务的快速发展&#xff0c;数据量急剧增长&#xff0c;传统数据管理方式已无法满足高效处理和分析大数据的需求。建立一个集数据存储、处理、分析、可视化于一体的大数据管理中心&#xff0c;提升数据处理能力&#xff0c;加速业务决策过程&#xff0…

Hive3:Hive初体验

1、创建表 CREATE TABLE test(id INT, name STRING, gender STRING);2、新增数据 INSERT INTO test VALUES(1, 王力红, 男); INSERT INTO test VALUES(2, 钉钉盯, 女); INSERT INTO test VALUES(3, 咔咔咔, 女);3、查询数据 简单查询 select * from test;带聚合函数的查询 …

自动驾驶-机器人-slam-定位面经和面试知识系列01之常考公式推导(01)

李群李代数扰动bundle adjustment 这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客也会同步更新&#xff0c;全网…

IDEA-安装插件 驼峰下划线转换

第一步&#xff1a;安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步&#xff1a;设置 file-settings-editor-camel_case 第三步&#xff1a;使用 选中想转换的遍历 使用快捷键 Alt Shift U

Linux中tomcat下载教程

一.安装tomcat 1.安装 EPEL 仓库&#xff1a; sudo yum install epel-release2.安装 Tomcat&#xff1a; sudo yum install tomcat3.启动 Tomcat 服务&#xff1a; sudo systemctl start tomcat4.启用 Tomcat 服务开机启动&#xff1a; sudo systemctl enable tomcat5.检查…

Java | Leetcode Java题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…

ElasticSearch(三)—文档字段参数设置以及元字段

一、 字段参数设置 analyzer&#xff1a; 指定分词器。elasticsearch 是一款支持全文检索的分布式存储系统&#xff0c;对于 text类型的字段&#xff0c;首先会使用分词器进行分词&#xff0c;然后将分词后的词根一个一个存储在倒排索引中&#xff0c;后续查询主要是针对词根…

如何通过netsh命令重启主机网卡?

正文共&#xff1a;999 字 15 图&#xff0c;预估阅读时间&#xff1a;1 分钟 不知道各位遇到过没有&#xff0c;VMware Workstation的NAT网卡经常出现一种情况&#xff1a;在虚拟机里面访问外部网络还是正常的&#xff0c;但是从宿主机却访问不到虚拟机。 说实话&#xff0c;这…

el-upload照片墙自定义上传多张图片(手动一次性上传多张图片)包含图片回显,删除

需求&#xff1a;el-upload照片墙自定义上传多张图片&#xff08;手动一次性上传多张图片&#xff09;包含图片回显&#xff0c;删除&#xff0c;预览&#xff0c;在网上看了很多&#xff0c;都没有说怎么把数据转为file格式的&#xff0c;找了很久最终实现&#xff0c; 难点&a…

【SpringBoot】1 Gitee

本项目 Gitee 地址&#xff1a;https://gitee.com/Lin_DH/system idea中可能装个gitee的插件&#xff0c;这样操作起来比较方便。 1&#xff09;登录 Gitee 官网&#xff08;https://gitee.com/&#xff09;&#xff0c;新建仓库。 2&#xff09;复制新建的 Gitee 仓库地址&am…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率&#xff0c;并且最近微软官方也是开源了一下graphrag的源码&#xff0c;所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术&#xff0c;也就是我们提出问题的时候&…

秋招突击——7/22——复习{堆——前K个高频元素}——新作{回溯——单次搜索、分割回文串。链表——环形链表II,合并两个有序链表}

文章目录 引言复习堆堆——前K个高频元素个人实现复习实现二参考实现 新作单词搜索个人实现参考实现 分割回文串个人实现参考实现 环形链表II个人实现参考实现 两个有序链表个人实现 总结 引言 又是充满挑战性的一天&#xff0c;继续完成我们的任务吧&#xff01;继续往下刷&a…

【C++】模板详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

域内攻击手法——AS-REP Roasting攻击和Kerberoasting攻击

一、AS-REP Roasting攻击 1、AS-REP Roasting攻击原理 AS-REP Roasting是一种对用户账户进行离线爆破的攻击方式。但是该攻击方式使用上比较受限&#xff0c;因为其需要用户账户设置不要求Kerberos 预身份验证选项&#xff0c;而该选项默认是没有勾选的。Kerberos 预身份验证…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-发送信息服务处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、因为仿钉钉设计器里发送消息处理是一个服务任务&#xff0c;所以要根据这个服务任务进行处理 2、这里目前只对消息进行处理&#xff0c;就是用websocket的发送方式 输入相应的内容&…

最新爆火的开源AI项目 | LivePortrait 本地安装教程

LivePortrait 本地部署教程&#xff0c;强大且开源的可控人像AI视频生成 1&#xff0c;准备工作&#xff0c;本地下载代码并准备环境&#xff0c;运行命令前需安装git 以下操作不要安装在C盘和容量较小的硬盘&#xff0c;可以找个大点的硬盘装哟 2&#xff0c;需要安装FFmp…

Java-- Stream流

感受stream流 代码 package demo1;import javax.naming.Name; import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class StreamDemo1 {public static void main(String[] args) {ArrayList<String> list1 new ArrayList<>();l…

基于深度学习算法,支持再学习功能,不断提升系统精准度的智慧地产开源了。

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。通过计算机视觉和…

Java | Leetcode Java题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution {public int numSquares(int n) {if (isPerfectSquare(n)) {return 1;}if (checkAnswer4(n)) {return 4;}for (int i 1; i * i < n; i) {int j n - i * i;if (isPerfectSquare(j)) {return 2;}}return 3;}// 判断是否为…