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

news2024/11/27 22:22:30

目录

一、正则表达式

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.coloradmin.cn/o/1952005.html

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

相关文章

vue3获取、设置元素高度

前言 在web端常见的需求场景中&#xff0c;会经常遇到table表格需要根据页面可视区域使高度自适应的情况。 傻喵(作者本人)昨天在尝试使用vue3实现这个需求时&#xff0c;看了几篇网上写的回答&#xff0c;都不太全面&#xff0c;所以干脆自己写个总结吧.(第一次写&#xff0c…

深入探讨 I/O 多路复用:提升系统 I/O 效率的关键技术

摘要 I/O&#xff08;输入/输出&#xff09;操作是计算机系统中不可或缺的一部分&#xff0c;而 I/O 多路复用技术则是提高系统 I/O 效率的重要手段。本文将浅谈 I/O 的基本概念&#xff0c;重点探讨 I/O 多路复用技术的原理、优势以及在现代系统中的应用。 引言 在现代计算…

php收银系统源码-收银员操作权限

收银系统是很多门店&#xff0c;尤其是连锁门店营业的必备工具&#xff0c;收银员每天需要通过收银系统记录商品的售卖数量&#xff0c;以及收款&#xff0c;会员开卡&#xff0c;核销订单等工作。但很多门店都不希望给收银员太高的权限&#xff0c;自然就离不开收银员的权限管…

flask开启调试模式,热部署

这里写自定义目录标题 功能快捷键 什么是热部署&#xff1f;简单说就是你程序改了&#xff0c;现在要重新启动服务器&#xff0c;嫌麻烦&#xff1f;不用重启&#xff0c;服务器会自己悄悄的把更新后的程序给重新加载一遍&#xff0c;这就是热部署&#xff08;抄的&#xff09;…

NameSilo域名注册和解析2024版教程(附优惠码)

上次给大家介绍了国外知名的域名注册商Dynadot&#xff0c;今天再给大家分享另一家国外知名的域名注册商NameSilo&#xff0c;同样性价比很高。使用本站提供的优惠码&#xff1a;ieearn.com&#xff0c;你还可以在首次注册购买域名时享受1美元的优惠&#xff1a; NameSilo简介…

10 VUE Element

文章目录 VUE1、概述2、快速入门3、Vue 指令4、生命周期5、案例 Elemant1、快速入门2、Element 布局3、常用组件-案例 VUE 1、概述 Vue 是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据…

AI机器人本地免费部署(部署Llama 3.1详细教程)

昨日&#xff0c;Meta公司发布了人工智能模型——Llama 3.1。 那么Llama 3.1 405B的效果怎么样&#xff1f;我们来对比一张图&#xff0c;横向对比一下GPT-4。 可以看出&#xff0c;Llama 3.1 405B在各类任务中的表现可以与GPT-4等顶级的模型相差无几。 那么&#xff0c;我们…

4G新型智能电表是什么?

4G新型智能电表是一种利用第四代移动通信技术(4G)进行数据传输的先进计量设备。它不仅具备传统电表的基本功能&#xff0c;如电量计量&#xff0c;还能实现远程抄表、用电监控、故障检测等多种智能化服务。本文旨在详细介绍4G新型智能电表的技术特点、优势及应用场景。 一、4G…

【C++刷题】优选算法——队列+宽搜

N 叉树的层序遍历 vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if (root nullptr) return ret;queue<Node*> q;q.push(root);ret.push_back({root->val});int size 1;while (!q.empty()) {vector<int> v…

03。正式拿捏ArkTS语言第一天

1, 打印日志命令 &#xff1a; console.log() 2, 三种基本数据类型&#xff1a; number 数字类型 &#xff08;数字&#xff09; string 字符串类型&#xff08;例如&#xff1a;“我是字符串”&#xff09; boolean 布尔类型 (true 或者 false) ***…

宝塔Docker部署Nuxt3 BBS项目

体验地址 BBS&#xff1a;http://bbs.sourcebyte.vip Nuxt3&#xff1a;https://nuxt.com.cn BBS项目介绍 BBS是开源字节最新研发的社区项目&#xff0c;包含产品中心&#xff0c;需求墙&#xff0c;工具&#xff0c;资讯4大板块。 1、产品中心&#xff1a;开源字节有众多…

常见的jmeter面试题及答案

1、解释什么是JMeter? JMeter是一款Java开源工具&#xff0c; 用于性能负载测试。它旨在分析和衡量Web应用程序和各种服务的性能和负载功能行为。 2、说明JMeter的工作原理? JMeter就像一群将请求发送到目标服务器的用户-样。它收集来自目标服务器的响应以及其他统计数据&…

python利用lxml模块爬取百度贴吧标题列表—新手练习的项目

一、爬取需求 就是用python&#xff0c;获取某百度贴吧的标题 二、代码 import lxml.html import requests ydm requests.get(https://tieba.baidu.com/f?ieutf-8&kw%E5%BC%A0%E5%A7%93%E4%B9%8B%E5%AE%B6).content.decode() selector lxml.html.fromstring(ydm) inf…

Java 每日一题: for 与 foreach 的区别 ?

for 循环&#xff1a;是最基本的循环结构&#xff0c;可以通过初始化语句、循环条件和迭代语句来控制循环的执行。 foreach 循环&#xff08;也称为增强型 for 循环&#xff09;&#xff1a;用于遍历集合或数组中的元素&#xff0c;简化了遍历过程&#xff0c;没有显式地控制索…

虚拟局域网——VLAN

VLAN的定义 VLAN virtual local Area Network 虚拟局域网&#xff0c;将物理上的局域网LAN在逻辑上进行划分 使用VLAN技术可以有效隔离广播域&#xff0c;减少网络中不必要的带宽消耗&#xff0c;如图&#xff0c;192.168.1.1发送一个广播帧&#xff0c;那么在这个广播域中的所…

HBuilder X中配置vue-cli项目和UI库

目录 一.前端项目结构 二.在HBuilder X中搭建vue-cli项目 1. 安装node.js前端环境 2. HBuilder X创建一个vue-cli项目 3. vue-cli项目结构 4. 如何运行前端项目 5. 创建组件 6. 组件路由(页面跳转) 6.1 创建router目录 6.2 使用路由 6.3 在main.js中配置路由 6.4 路…

多多OJ评测系统 在前端脚手架Vue-Cli中设置页面路由

目录 设置页面路由 我们把菜单上的路由改成读取路由文件 设置成export 导出路由 在刚刚的原始路由 index.ts中导入就行了 在这边引入我们的路由文件 我们之后点击菜单 我们的路由文件是这样的 但是没有跳转 写一下事件 接下来要同步路由到菜单项 自己定义监听函数 …

【吊打面试官系列-Dubbo面试题】Dubbo 服务降级,失败重试怎么做?

大家好&#xff0c;我是锋哥。今天分享关于 【Dubbo 服务降级&#xff0c;失败重试怎么做&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Dubbo 服务降级&#xff0c;失败重试怎么做&#xff1f; 可以通过 dubbo:reference 中设置 mock"return null"…

认知是门槛、红利和自己人生的奇异点

认知是门槛、红利和自己人生的奇异点 我发现&#xff0c;身边绝大部分有钱人&#xff0c;「认知」都已经处于比较高的层次&#xff0c;人的认知其实分6个层级: 第一层&#xff0c;环境层第二层&#xff0c;行为层第三层&#xff0c;能力层第四层&#xff0c;BVR 层第五层&…

Android WebViewClient 的 `shouldOverrideUrlLoading` 方法

简介 在Android开发中&#xff0c;WebView是一个强大的工具&#xff0c;可以在你的应用中显示网页内容。了解 WebViewClient 中的 shouldOverrideUrlLoading 方法是至关重要的&#xff0c;因为这个方法允许你控制 URL 在 WebView 中的处理方式。 在本文中&#xff0c;我们将详…