linux通配符和正则表达式深层解析...

news2024/11/28 6:27:05

目录:

(一)了解通配符和正则的作用

(二)通配符的使用

(三)正则表达式的使用

(四)扩展正则表达式的使用

(一)了解通配符和正则的作用

(1.1)在我们日常的工作中,我们都会使用到通配符或者正则表达式。通配符是一种特殊语句,主要有星号(*)和问号(?),用来模糊搜索文件。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。正则表达式是计算机科学的一个概念,正则表达式通常被用来检索、替换那些符合某个模式的文本,正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

(1.2)不管是通配符还是正则表达式,其功能都是实现模糊匹配,用来匹配某一类东西,并不是匹配具体的某一个值。通配符一般用于shell中,正则表达式一般用于其他语言。

(二)通配符的使用

(2.1)首先第一个是“[]”中括号[list],匹配的是list中的任意单一字符。例如a[xyz]b,a与b之间必须也只能有一个字符,但只能是x或y或z,如:axb,ayb,azb

(2.2)第二个是“[c1-c2]”,用来表示字符的范围,匹配c1-c2的任意单一字符,如[0-9]或[a-z]。例如“a[0-9]b”表示的是0到9之间必须也只能有一个字符,如:a0b、a1b、a2b、a3b、a4b、a5b、a6b、a7b、a8b、a9b

注意:如果我们需要匹配的是单个字母,且不分大小写,则我们可以使用“[a-zA-Z]”来进行表示。

(2.3)第三个是“[!c1-c2]或[^c1-c2]”,匹配的是不在c1-c2的任意字符。例如a[!0-9]b,a[^0-9]b表示a与b之间只有一个字符,并且不是数字0-9之间的字符,符合要求的有:acb、adb

(2.4)示例:我们在vms002主机上创建一个rh124目录,然后在rh124目录中创建相关的文件:11111、a111、a_111、a22、lwang、lWang、rh124。接着我们查询第一个字符时a到z之间的,第二个字符是非数字的,后面的字符都是任意的。

# mkdir rh124

# touch 11111 a111 a_111 a22 lwang lWang rh124

# ls [a-z][^0-9]*---查询第一个字符时a到z之间的,第二个字符是非数字的,后面的字符都是任意的

acbd93cad9a511805a3fdf62c19736b1.png

3889cbc7c4134f1e1310b8052f786b72.png

(2.5)示例:接着我们的需求是在rh124目录下找到格式为第一个字符是a到z之间,第二个字符是a或者“-”或者z三个字符中的任意一个,后面的字符是任意的。这样我们就可以符合要求的文件名a-1

# touch a-1

# ls [a-z][a-z]*

159bd4661742d539220305eebeea389d.png

(2.6)第四个是精确指定字符的大小写“[[:upper:]]”、“[[:lower:]]”,由于我们使用[a-z]的时候可能会匹配出a到z和A到Z之间的字符,大小写并不能精确匹配,所以我们可以使用“[[:upper:]]”表示纯大写的字符,我们可以使用“[[:lower:]]”表示纯小写的字符。

# ls [[:upper:]]*---查询所有纯大写字目开头的文件名

# ls [[:lower:]]*---查询所有纯小写字母开头的文件名

2c0355109ae9fd7b974933689c281069.png

(2.7)当然第四个精确指定字符中还是有其他表示特定字符的方式的:“[[:alpha:]]”表示的是只匹配字母,“[[:alnum:]]”表示的是匹配字母和数字,“[[:digit:]]”表示的是匹配纯数字。

(2.8)示例:现在我们的系统中没有marry用户,我们首先创建一个marry用户,并且指定在根下创建marry的家目录(图1-5)。然后我们将marry家目录删除,此时我们切换到marry用户后发现由于没有家目录,所以切换后是异常的状态(图1-6),此时我们在/etc/default/useradd配置文件中,查询到用户家目录的模板文件在/etc/skel的目录中(图1-7),我们将/etc/skel中的所有模板文件都拷贝到marry家目录下,并修改了属主和属组的相关信息,此时便可以正常的进行marry用户的切换了(图1-8)。

# useradd -d /marry marry---创建一个marry用户,并且指定在根下创建marry的家目录

# rm -rf /marry/---删除marry的家目录

# vim /etc/default/useradd---查询/etc/default/目录下的useradd文件

# cp -a /etc/skel/.[^.]* /marry/---将/etc/skel/目录下的所有以“.”开头,第二个字符由于是“[]”所以必须要存在而且是非“.”号,后面跟任意字符的文件全部拷贝到/marry家目录下,skel表示骨架、框架(图1-8)

# chown -R marry.marry /marry/---修改/marry家目录的所有者和所属组都为marry(图1-8)

9b4420e0695df4a1719ec89697cfaf90.png

c4bc092989cd31151ed18c63b9a90ee0.png

9e9ee0d38609bd1425a5536e68d79983.png

a347f95932ec323ff306e00cf9fdf2ee.png

(2.9)第五个是“?”问号,匹配的是任意一个字符。例如在rh124目录中,我们查询“[a-z]????”,表示的是查询第一个字符是字母构成,后面会有四个任意的字符构成的文件名。

注意:“?”问号是不能匹配到表示隐藏文件的“.”点号的。即表示如果现在系统中有“.aa”文件,我们使用“???”是不能匹配出这个隐藏文件的,如果我们想要匹配出这类隐藏文件则应该开启全局通配符处理。

# ls [a-z]????---查询第一个字符是字母构成,后面会有四个任意的字符构成的文件名

2b366c9d1b1c3f3e4914fcceb633d1fa.png

(2.10)第六个是“*”星号,表示匹配任意长度的任意字符。例如我们将所有文件名以a字母开头,且后面是任意字符的文件都删除掉

# touch aaa bb cc aa2---创建如下的四个文件

# rm -rf a*---将所有文件名以a字母开头,后面是任意字符的文件都删除掉

acf88457bb6876694118fe4ea84024a3.png

(2.11)第七个是“\”反斜线,表示转义符,有时候我们在当前系统中安装vsftp软件的时候我们可能会使用“# yum install vsftp*”进行安装,但是由于我们在执行系统命令的时候,首先是在shell进程中运行然后才到达YUM仓库中去进行相关的软件包查找工作。即我们在执行“vsftp*”的时候,shell会首先对“vsftp*”进行shell解析,查找当前目录中是否有符合“vsftp*”格式的文件,如果现在我们的当前目录中存在着一个文件vsftp123,则此时shell会将“vsftp*”解析成“vsftp123”,然后再到YUM仓库中去查找“vsftp123”的软件包进行安装,而这样的情况并不是我们所希望的。所以我们在shell中执行安装软件包的命令时,一般是建议使用转义符“# yum install vsftp\*”这样的格式进行安装是比较好的,这样就可以防止shell对我们所使用的通配符进行解析的情况产生。

# yum install vsftp\*---使用转义符对通配符进行转义,防止shell对通配符进行解析

# yum install 'vsftp*'---也可以使用单引号来进行转义,防止shell对通配符进行解析

(2.12)需要注意的是,我们在创建文件的时候,文件名是不可能包含“/”的,因为有“/”就是代表创建了一个目录。

# touch rh124/cc---此时“rh124/cc”并不是表示一个文件名,而是表示在rh124/目录下创建一个cc文件

b0beda450b60145bf5cecb7f013e1c79.png

(三)正则表达式的使用

(3.1)正则表达式是用来匹配字符串的,针对文件内容的文本过滤工具,大都用到正则表达式,如vim、grep、awk、sed等。正则表达式和我们上面说的通配符实现的效果都是一样的,是为了实现查询信息的模糊匹配。

(3.2)第一个“^”表示开头,例如我们先将/etc/passwd文件拷贝到当前目录中,然后查询passwd文件中以root字符开头的行,此时可以使用“^”来进行标识。

# grep ^root passwd

028e0f167861d0d8f0cef4681e1bf327.png

(3.3)第二个“$”表示行末,我们先将passwd文件中的相关行进行设计一下,然后查找每一行行末是“bash”字符的行。

# grep bash$ passwd---查询行末字符是bash字符的所有行

2a5a52629318a5203a3d19ebbef4643d.png

05bb9c388eb7aaa15acf7e5752c60346.png

(3.4)第三个“\

# grep '\

# grep '\btom' aa.txt---查询以tom字符开头的所有行

04a2f1c45268f4a3e81c99a5a91051a3.png

a1299ae53db9f93074f4d3c2d0ace459.png

(3.5)第四个“\>”或者“\b”表示锚定的是单词的末尾,在aa.txt文件中,我们查询“tom\>”以tom字符结束的所有行(图1-17)。如果我们希望查询出所有以tom为单词独立存在的行时,我们可以同时使用“\”符号(图1-18)。

# grep 'tom\>' aa.txt---查询“tom\>”以tom字符结束的所有行

# grep 'tom\b' aa.txt---查询“tom\b”以tom字符结束的所有行

# grep '\' aa.txt---查询出所有以tom为单词独立存在的行

# grep '\btom\b' aa.txt ---查询出所有以tom为单词独立存在的行

9b23bb9595c9564e50f9ac6ab6e97bc6.png

c6abf0da288bfacb18cce994751807fa.png

(3.6)示例:现在我们希望查询SELinux中对端口设置的上下文信息,如果需要过滤具体的端口号的信息,则可以使用“\”来指定独立的单词信息,例如过滤出只包含80端口上下文的行,如果我们只是使用“grep 80”过滤出的信息是不正确的(图1-19),我们应该使用“grep '\<80\>'”才是正确的(图1-20)。

# semanage port -l | grep 80---查询当前系统中所有包含80端口上下文的信息

# semanage port -l | grep '\<80\>'---查询当前系统中只含有80端口上下文的信息行

1ff9aed3bfd08b0719f83d609a0194bc.png

12f9958248cb15b4313cea84944087b4.png

(3.7)第五个“.”表示单个任意字符,和通配符中的“?”问号的意义一致。例如我们想要匹配出aa.txt文件中to单词后跟任意一个字符的所有符合要求的行(图1-21)。如果我们希望“.”符号没有模糊查询的意思,就代表它本身的字符的意思,则我们可以使用“\”作为转义符,这样就可以直接查询出包含“to.”字样的行(图1-22)。

# grep 'to.' aa.txt---查询出所有符合to单词后还会跟一个任意字符的行

# grep 'to\.' aa.txt---使用转义符,直接查询包含“to.”字符的行

f772252ed87a7ad03660c09224209857.png

7bfc9388b2a6bd6093958a6e06b2d865.png

(3.8)第六个“[]”,表示的是匹配指定范围内的任意单个字符。

(3.9)第七个“[^]”,表示的是匹配指定范围外的任意单个字符。

(3.10)分组概念

(3.10.1)第八个“{2}\.\'

880ec607169c86290e51fc8013873fdd.png

(4.9)一般我们在表示正则表达式中表达式的部分的时候是建议加上单引号将表达式引起来的。如果我们在系统中如果原先存在一个toz文件名的文件,此时我们对表达式不加单引号的情况下,首先会将查询的“to?”发送到shell中进行shell解析,此时sehll会对应“to?”在系统中查找并解析成“toz”,然后再将“toz”发送到egrep中进行解析,此时在aa.txt文件中是查询不出来任何信息的。所以一般是需要将表示正则表达式中表达式的部分的时候是建议加上单引号这样可以防止shell解析的情况发生。

# egrep 'to?' aa.txt---查询aa.txt中to单词后出现一个任意字符,这个任意字符出现0次或者1次

# egrep to\? aa.txt---和以上使用单引号的效果一致

1b8a229e080a205a642ab0f34b0ad61b.png

—————— 本文至此结束,感谢阅读 ——————

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

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

相关文章

交换机和路由器到底有什么区别???

我&#xff1a;度娘度娘&#xff0c;交换机和路由器的区别是什么呢&#xff1f; 度娘&#xff1a;一个工作在第二层数据链路层&#xff0c;一个工作在第三层网络层。 我&#xff1a;哈&#xff1f;那工作在不同层会有什么区别&#xff1f;为什么要工作在不同层&#xff1f; …

2023五一数学建模A题完整思路

已更新五一数学建模A题思路&#xff0c;文章末尾获取&#xff01; A题完整思路&#xff1a; A题是一个动力学问题&#xff0c;需要我们将物理学概念运用到实际生活中&#xff0c;我们可以先看题目 问题1&#xff1a; 假设无人机以平行于水平面的方式飞行&#xff0c;在空中投…

Windows11安装sqlserver2012失败后解决方案

首先卸载 WinR打开运行输入services.msc查看所有服务/或者我的电脑管理找到服务列表/任务管理器进入服务列表&#xff0c;停止所有与Sql Server有关的服务&#xff0c;如下&#xff1a; 打开控制面板-卸载sqlserver所有相关软件&#xff1b; 删除SQL Server相关注册表&#…

【观察】中国软件行业进入“重构期”,看浪潮海岳如何“开新局”

众所周知&#xff0c;改开四十多来年&#xff0c;中国软件产业在经历了萌芽与低谷、摸索与转型后&#xff0c;逐步进入了快速发展期。特别是过去几年&#xff0c;在新的发展格局&#xff0c;信创替代的进程中&#xff0c;整个中国软件业更是加速进入了全新的“重构期”。 在此过…

Unity API详解——Quaternion类

Quaternion类又称四元数&#xff0c;由x、y、z和w这4个分量组成&#xff0c;属于struct类型。在Unity中&#xff0c;用Quaternion来存储和表示对象的旋转角度。Quaternion的变换比较复杂&#xff0c;对于GameObject一般的旋转及移动&#xff0c;可以用Transform中的相关方法实现…

CH32V307环境参数在线监测系统(一)

CH32V307环境参数在线监测系统是以CH32V307VCT6为核心&#xff0c;由ESP8266模块、DHT11温湿度传感器模块、TFT LCD显示屏组成。系统实物图如下所示&#xff1a; 系统功能主要有RTC实时时钟、WIFI网络授时、DHT11温度测量、温湿度数据实时上传到onenet平台、屏幕定时刷新等功能…

在Docker上安装和运行MySQL容器(纯步骤)

在Docker上安装和运行MySQL步骤 本文章只有操作步骤&#xff0c;没有原理解释&#xff0c;只是在学习当中提醒自己安装步骤。 第一步&#xff1a;从远程仓库拉取MySQL镜像 1.从远程仓库搜索mysql镜像 docker search mysql2.pull拉取镜像 这里我选择的是mysql的5.7版本 docker…

盘点 5 个 yyds 的 AI 绘画辅助工具

国外著名的 AI 作图工具 Midjourney、Stable Diiffusion 都可以根据你输入的指令生成一张图片。 如果你想输出高质量的图片&#xff0c;需要掌握一些 prompt 指令技巧。本文章便盘点了 5 个 GitHub 上的开源项目&#xff0c;引领你更好的上手 AI 作图。 本期推荐开源项目目录&…

软件杯龙源风电赛题培训!千万分钟数据和全流程基线等你来战

‍‍ “中国软件杯”大学生软件设计大赛是一项面向中国在校学生的公益性赛事&#xff0c;大赛由国家工业和信息化部、教育部、江苏省人民政府共同主办&#xff0c;是全国软件行业规格最高、最具影响力的国家级一类赛事。其中&#xff0c;作为重点赛题的龙源风电赛&#xff0c;上…

我们分析了9.12亿篇博客文章,得出了11条内容营销发现

我们分析了 9.12 亿篇博客文章&#xff0c;想要更好地了解目前的内容营销领域。 具体来说&#xff0c;我们研究了这些文章的内容格式、字数和标题等因素与社交媒体分享和反向链接的关联性。 在我们的数据合作伙伴BuzzSumo的帮助下&#xff0c;我们有了一些非常有趣的发现。 …

Dex-Net使用手册————GQCNN网络

1. Dex-Net Package GitHub - BerkeleyAutomation/dex-net &#x1f388;dex-net Python 包用于打开、读取和编写 HDF5 数据库的 3D 对象模型、平行下颚抓取和掌握鲁棒性指标。 &#x1f388;HDF5数据库还可用于生成大量数据集&#xff0c;将点云和抓取的元组与二进制抓取鲁棒…

【Python】【进阶篇】12、搭建Django开发环境

目录 搭建Django开发环境1. 安装Python解释器2. 安装MySQL数据库3. 安装Python包管理器4. 安装 Pycharm IDE 搭建Django开发环境 上一章我们介绍了 Django 框架的重要组件&#xff0c;常言道“工欲善其事&#xff0c;必先利其器”&#xff0c;在正式创建 Django 项目之前&…

AI绘画——Lora模型Niji-Expressive V2 launch(灵动优雅,张力尽显)

目录 Niji-Expressive V2 launch!! 灵动优雅&#xff0c;张力尽显 Vivid and elegant, full of tension 模型演示&#xff08;多图预警&#xff09; Niji-Expressive V2 launch!! 灵动优雅&#xff0c;张力尽显 本次升级泛用性&#xff0c;能在更多模型和采样方式上适用 …

《一文带你读懂:云原生时代业务监控》

点击上方蓝字关注我们&#xff01; 对业务来说&#xff0c;完备的应用健康性和数据指标的监控非常重要&#xff0c;通过采集准确的监控指标、配置合理的告警机制&#xff0c;我们能够提前或者尽早发现问题&#xff0c;并做出响应、解决问题&#xff0c;进而保证产品的稳定性&am…

vue性能优化之虚拟列表滚动

一、前言 前端的性能瓶颈那就是页面的卡顿&#xff0c;当然这种页面的卡顿包含了多种原因。 例如HTTP请求过多导致数据加载变慢&#xff0c;下载的静态文件非常大导致页面加载时间很长&#xff0c;js中一些算法响应的时间过长等。很多前端工程师都花费很多的精力在dom渲染上来…

Java 入门 - 语法基础

hello world public class Hello {public static void main(String[] args) {System.out.println("hello world");} } 复制代码 public: 是关键字&#xff1b;表示公开的class: 是关键字&#xff1b;用来定义类Hello: 是类名&#xff1b;大小写敏感&#xff1b;命名…

BFS算法专题

BFS算法专题 框架篇LeetCode 111. 二叉树的最小深度解题思路代码实现 LeetCode 752. 打开转盘锁解题思路代码实现 LeetCode 773. 滑动谜题解题思路代码实现 总结 不要纠结&#xff0c;干就完事了&#xff0c;熟练度很重要&#xff01;&#xff01;&#xff01;多练习&#xff0…

Vivado约束添加方法:一文全面解析IO和时序约束

FPGA开发离不开IO约束和时序约束&#xff0c;IO约束用于确定输入/输出端口的物理端口和电气特性&#xff0c;与芯片和电路设计有关。而时序约束则用于设定FPGA设计中的时序特性&#xff0c;以确保系统能够在预期时钟频率下正常运行。本文将介绍vivado中常见的设置约束的方法。 …

mysql 如何避免索引失效

案例演示 建表及初始化数据 CREATE TABLE staffs (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(24) NOT NULL DEFAULT ,age INT NOT NULL DEFAULT 0,pos VARCHAR(20) NOT NULL DEFAULT ,#职位add_time TIMESTAMP NOT NULL DEFAULT CURREN…

二维码在设备点维一体化管理中的应用

随着科技发展&#xff0c;设备点维一体化管理体系应运而生&#xff0c;该管理体系的出现让设备维护保养变得更加高效精细化。 设备点维一体化管理体系以设备点检和维护保养为基础&#xff0c;通过日常、专业及精密点检&#xff0c;对点检测得的数据和设备给油脂保养情况进行统…