十、通配符和正则表达式

10.1 通配符

通配符是由shell处理的, 它只会出现在 命令的“参数”里。当shell在“参数”中遇到了通配符

时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进

行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处

理。总之,通配符 实际上就是一种shell实现的路径扩展功能。在 通配符被处理后, shell会先

完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

10.1.1 SHELL中的通配符

10.1.2 通配符实例

1、显示所有menu0开头的文件

[root@kittod ~]# ls menu0*
menu01.sh menu02.sh menu03.sh menu04.sh

2、显示所有m开头后面只有单个字符的文件

[root@kittod ~]# ls m?
m1 m2 m3

3、显示所有m或者n开头的文件

[root@kittod ~]# ls [mn]*
m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh n71 n72 n73

4、显示所有以字母开头的文件

[root@kittod ~]# ls [A-z]*
BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh 
n71 n72 n73

5、显示所有数字开头的文件

[root@kittod ~]# ls [0-9]*
12a 12b 12c 12d

6、查看所有不区分大小写的字母开头的文件

[root@kittod ~]# ls [[:alpha:]]*
BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh 
n71 n72 n73

7、查看所有以数字开头的文件

[root@kittod ~]# ls [[:digit:]]*
12a 12b 12c 12d

8、查看所有以字母或者数字开头的文件

[root@kittod ~]# ls [[:alnum:]]*
12a 12b 12c 12d BC1 BC2 BC3 m1 m2 m3 menu01.sh menu02.sh menu03.sh menu04.sh n71 n72 n73

10.2 正则表达式介绍和使用

在Linux命令行操作或者SHELL编程中总是容易混淆一些特殊字符的使用,比如元字符‘*’号,作为通配符匹配文件名时表示0个到无穷多个任意字符。而作为正则表达式匹配字符串时,表示重复0个到无穷多个的前一个字符。对于通配符和正则表达式之间容易理解的方法就是,在文本过滤命令中这些元字符是用做正则表达式,比如像awk,sed,grep等,主要是针对文件内容的。然而通配符多用在文件名上,比如查找find,ls,cp,mv等等。没有特殊说明,正则表达式就是指基础正则表达式。

10.2.1 什么是正则表达式

正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等。

10.2.2 为什么使用正则表达式

在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。

10.2.3 如何学习正则表达式

1. 重点在于理解元字符

2. 掌握好正则表达式的语法

3. 开拓思路,寻找最佳的表达方法

10.2.4 如何使用正则表达式

当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其正确与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中,用户可以使用grep命令来测试。

grep家族有三大成员分别为:

grep:支持使用基本正则表达式。

egrep:支持使用扩展正则表达式。

fgrep:不支持使用正则表达式,即所有的正则表达式中的元字符都将作为一般字符,仅仅拥有其字面意义,不再拥有特殊意义。

grep命令的名称来自于全局搜索正则表达式并打印文本行(Global Search Regular Expression and Print out the line)的缩写。它是一个非常古老的UNIX命令,也是一种强大的文本搜索工具。grep命令使用正则表达式来搜索文本,并且把匹配的文本行打印出来。

grep命令根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行,即文本搜索工具。注:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。

grep命令的基本语法如下:grep [options] pattern [file…]

在上面的语法中,options表示选项,选项列表如下表。pattern表示要匹配的模式,file表示

一系列的文件名。grep命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出

来。模式后面的所有的字符串参数都被看作是文件名。

-n :显示行号
-o :只显示匹配的内容
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl
'root' /etc
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来
--color:高亮颜色显示匹配到的字符串
-c :如果匹配成功,则将匹配到的行数打印出来
-E :等于egrep,扩展
-i :忽略大小写
-v :取反,不匹配
-w:匹配单词
-r:递归搜索,不仅搜索当前目录,还要搜索其各级子目录
-s:不显示关于不存在或者无法读取文件的错误信息

10.3 基本正则表达式

基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一,另外一种语法标准称为扩展正则表达式。

示例:

1)^word 表示搜索以word开头的内容。

[root@server ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@server ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash

2)word$ 表示搜索以word结尾的内容。

[root@server ~]# grep bash passwd
root:x:0:0:root:/root:/bin/bash
fox:x:1000:1000::/home/fox:/bin/bash
cel:x:1001:1001::/home/cel:/bin/bash
[root@server ~]# grep bash$ passwd
root:x:0:0:root:/root:/bin/bash
fox:x:1000:1000::/home/fox:/bin/bash
cel:x:1001:1001::/home/cel:/bin/bash

3)^$ 表示空行,不是空格。

[root@server ~]# grep ^$ passwd 





[root@server ~]# grep ^$ passwd -n
18:
19:
20:
25:
29:

4). 代表且只能代表一个任意字符。

[root@server ~]# grep r.t passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@server ~]# grep r..t passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@server ~]# grep r...t passwd
unbound:x:997:996:Unbound DNS resolver:/etc/unbound:/sbin/nologin

5)* 重复0个或多个前面的字符

[root@server ~]# grep r*t passwd

6)[] 匹配字符集合内任意一个字符,如[a-z]

[root@server ~]# grep r[a-z]t passwd
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@server ~]# grep r[a-z]*t passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
systemd-timesync:x:988:988:systemd Time Synchronization:/:/usr/sbin/nologi

7. [^abc]在中括号里表示非,不包含a或b或c

[root@server ~]# grep r[^a-z]*t passwd
rt
r.t
r..t

8){n,m} 匹配n到m次,前一个字符。

{n,} 至少N次,多了不限。

{n} n次

{,m} 至多m次,少了不限。

注意:grep要将{}转义,{},egrep不需要转义

[root@kittod ~]# grep 'r[^a-z]\{3,\}' passwd
[root@kittod ~]# grep -E 'r[^a-z]{3,}' passwd

10.4 扩展正则表达式

扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”、“$”、“.”、“*”、“[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。

10.5 正则表达式案例

1、显示/etc/passwd文件中以bash结尾的行;

[root@server ~]# grep bash$ /etc/passwd

2、找出/etc/passwd文件中的三位或四位数;

[root@server ~]# grep '[[:digit:]]\{3,4\}' /etc/passwd
[root@server ~]# grep -E '[[:digit:]]{3,4}' /etc/passwd

3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行;

[root@server ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0个或多个空白字符结尾的行;

[root@server ~]# netstat -tan | grep "LISTEN[[:space:]]*$"

5、找出"fdisk -l“命令的结果中,取出硬盘路径;

 [root@server ~]#  fdisk -l | grep Disk | grep /dev/nv | cut -d: -f 1 | cut -d " " -f2

6、找出”ldd /usr/bin/cat“命令的结果中文件路径;

[root@server ~]# ldd /usr/bin/cat | egrep [[:blank:]]\+/[[:graph:]]*

7、找出/proc/meminfo文件中,所有以大写或小写s开头的行

[root@server ~]# grep -i ^S /proc/meminfo

8、显示当前系统上root、centos或spark用户的相关信息;

[root@server ~]# grep -E ^"(root|centos|spark)" /etc/passwd
[root@server ~]# egrep ^"(root|centos|spark)" /etc/passwd

9、echo输出一个绝对路径,使用egrep取出其基名;

[root@server ~]# echo /mnt/sdc/ | grep -E -o "[^/]+/?$" | cut -d "/" -f 1

10、找出ifconfig命令结果中的1-255之间的整数;

[root@server ~]# ifconfig | egrep -w "[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]"

11. 找出ifconfig命令输出中的所有IP地址

 [root@server ~]# ifconfig | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

10.6 正则表达式练习

1、显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行;

[root@server ~]# grep -i ^h /etc/rc.d/rc.sysinit

2、显示/etc/passwd中以sh结尾的行;

[root@server ~]# grep sh$ /etc/passwd

3、显示/etc/fstab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;

[root@server ~]# grep -E ^#[[:space:]]+[^[:space:]]* /etc/fstab 
或者
[root@server ~]# grep -E ^#[[:space:]]\{1,\}[^[:space:]]* /etc/fstab 

4、查找/etc/rc.d/rc.local中包含“以to开始并以to结尾”的字串行;

[root@server ~]# grep -E to[A-z]*to /etc/inittab

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

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

相关文章

21.Happens-Before原则

文章目录 Happens-Before原则1.Happens-Before规则介绍2.规格介绍2.1.顺序性规则(as-if-serial)2.2.volatile规则2.3.传递性规则2.4.监视锁规则2.5.start规则2.6.join()规则 Happens-Before原则 JVM内存屏障指令对Java开发工程师是透明的,是JMM对JVM实现的一种规范和…

HE TB PPDU MU-RTS

看起来像是MU-RTS的触发帧的应答不是HE TB PPDU,而是传统得的帧,应答CTS。 非AP 的STA,是不能发送触发帧,也就是说,触发帧,只能是由AP发送给STA

RedHat9 | DNS剖析-配置主DNS服务器实例

一、实验环境 1、BIND软件包介绍 BIND软件是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护,全称为Berkeley Internet Name Domain。该软件在DNS(域名系统)领域具有重要地位,是目前世界上使用最…

网站笔记:huggingface model memory calculator

Model Memory Utility - a Hugging Face Space by hf-accelerate 这个工具可以计算在 Hugging Face Hub上托管的大型模型训练和执行推理时所需的vRAM内存量。模型所需的最低推荐vRAM内存量表示为“最大层”的大小,模型的训练大约是其大小的4倍(针对Adam…

AI播客下载:The Logan Bartlett Show Podcast(AI创业投资主题)

Logan Bartlett Show Podcast是一个播客,主持人Logan Bartlett与科技界的领导者以及投资者进行对话,讨论他们在运营或投资企业中学到的经验教训,主要集中在科技创投领域。 Logan Bartlett 是 Redpoint Ventures 的投资人,并且在该…

用户态下屏蔽全局消息钩子 —— ClientLoadLibrary 指针覆盖

目录 前言 一、研究 SetWindowsHookEx 的机制 二、概念验证 三、运行效果分析 四、总结与展望 参考文献 原文出处链接:[https://blog.csdn.net/qq_59075481/article/details/139206017] 前言 SetWindowsHookEx 函数帮助其他人员注入模块到我们的进程&#x…

蓝桥杯嵌入式国赛笔记(2):拓展板按键程序设计

目录 1、前言 2、电路原理 3、代码编写 3.1 读取Btn电压 3.2 检索按键 3.3 main文件编写 3.3.1 进行变量定义 3.3.2 AD_Key函数 3.3.3 LCD函数 3.3.4 main函数 3.3.5 完整代码 4、测试 5、总结 1、前言 本文进行拓展板按键程序设计,拓展板的按键是通…

Pycharm在下载安装第三方库时速度慢或超时问题 / 切换国内镜像地址

pycharm下载第三方库速度极慢,搜索了一下,发现方法非常乱,稍作整理。这个问题一般都会出现,在我们开发中遇到的常见问题,根据以下解决方法,基本可以解决,但是不能100%保证 Installing packages …

上位机图像处理和嵌入式模块部署(f103 mcu中的看门狗)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 项目开发中,我们总是希望固件代码能够稳定、健壮。为此,我们进行了各种软件质量管理,从需求开发开始&#xff0…

react组件传参 父传子可以传字符串,布尔值,数组,对象,jsx,

在react中&#xff0c;父传子组件 props的灵活性是很强大的&#xff0c;可以传字符串&#xff0c;布尔值&#xff0c;数组&#xff0c;对象&#xff0c;jsx&#xff0c; function Son(props) {console.log(props,"props的值")return(<div>这是儿子组件 {props.…

LeetCode 第131场双周赛个人题解

100309. 求出出现两次数字的 XOR 值 原题链接 求出出现两次数字的 XOR 值 - 力扣 (LeetCode) 竞赛 思路分析 签到题&#xff0c;一次遍历 AC代码 class Solution:def duplicateNumbersXOR(self, nums: List[int]) -> int:cnt Counter(nums)res 0st set(nums)for x …

Go微服务: Http服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把Http服务注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/go-mi…

插入耳麦耳机的麦克风线,但录入声音失败的解决办法

现状&#xff1a;可以查看到有麦克风&#xff0c;但说话时&#xff0c;音量条没有上升 解决&#xff1a;控制面板-语音识别。对头戴式耳机进行操作。 效果&#xff1a;完成后&#xff0c;用搜狗语音打字验证通过。 注意&#xff1a;电脑上还连接了个有线音箱&#xff0c;但说…

Python | Leetcode Python题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution:def hasPathSum(self, root: TreeNode, sum: int) -> bool:if not root:return Falseif not root.left and not root.right:return sum root.valreturn self.hasPathSum(root.left, sum - root.val) or self.hasPathSum…

从0开始学统计-蒙彼利埃尔悖论与条件概率

1.什么叫均衡可比&#xff1f; "均衡可比"指的是在进行比较时&#xff0c;确保所比较的对象或情况具有相似的特征和条件&#xff0c;以保持比较的公正性和准确性。这个概念通常应用于研究设计和数据分析中&#xff0c;以确保比较结果的可信度和有效性。 在研究中&a…

用 Pyinstaller 模块将 Python 程序打包成 exe 文件

一、安装Pyinstaller pip install Pyinstaller二、将 Python 程序打包成 exe 文件 Pyinstaller -F -w sum_income.py参考文献 用 Pyinstaller 模块将 Python 程序打包成 exe 文件&#xff08;全网最全面最详细&#xff0c;万字详述&#xff09;

ESP32-C3模组上跑通OTA升级(9)

接前一篇文章&#xff1a;ESP32-C3模组上跑通OTA升级&#xff08;8&#xff09; 本文内容参考&#xff1a; 《ESP32-C3 物联网工程开发实战》 乐鑫科技 特此致谢&#xff01; 七、固件版本 将不同功能的固件标记为不同版本是方便后期维护的一个重要手段。ESP-IDF提供了一些标…

MacPro中Ubuntu安装GNOME桌面

第一步&#xff0c;先在MacPro中安装UTM虚拟机。 查看另一文章&#xff1a; https://blog.csdn.net/qq_38382925/article/details/139157877?spm1001.2014.3001.5502 第二步&#xff0c;在虚拟机中安装Ubuntu ARM64 server 查看另一文章&#xff1a; https://blog.csdn.net/qq…

联想端游联运SDK接入指南

1. 接入流程 本文档主要介绍了 联想PC游戏SDK接入流程、联想游戏提供的功能、接入注意事项等。 1.1. 接入方式 1. 联想游戏SDK2.1版本支持“账号防沉迷支付”接入方式&#xff1b; a. 联想提供账号注册、登录等能力 b. 联想提供防沉迷服务 c. 联想提供游戏内支付 1.2. 对…

[MRCTF2020]Xor

32位程序 主要逻辑 flagMSAWB~FXZ:J:tQJ"N bpdd}8g for i in range(len(flag)):print(chr(ord(flag[i])^i),end)