十、通配符和正则表达式

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

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

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

相关文章

python安装依赖

创建 requirement.txt 文件并填充内容 flask2.0.0 pandas1.3.3 numpy1.21.2 安装模块 pip install -r requirement.txt

Spring boot使用集群方式、支持ssl连接redis的方法

1、需求背景 项目需要提供一个管理界面给内部人员操作用户信息,需要在修改用户信息后删除用户的redis缓存。用户所在的区域不同,其redis服务地址也不相同,因此需要管理多个redis连接,且redis要求以集群方式并支持ssl进行连接。 2…

Qt for android 获取USB设备列表(一)Java方式 获取

简介 QtActivity 作为 Qt 应用程序的入口点,负责启动和配置 Qt 应用程序的信息, 后面我们继承 QtActivity 做自定义控制,了解一下 Activity 生命周期概念, 因为 QtActivity 继承自Android的activity,使用周期函数完成我…

java8新特性——函数式编程详解

目录 一 概述1.1 背景1.2 函数式编程的意义1.3 函数式编程的发展 Lambda表达式1.1 介绍1.2 使用Lambda的好处1.3 Lambda方法1.3.1 Lambda表达式结构1.3.2 Lambda表达式的特征 1.4 Lambda的使用1.4.1 定义函数式接口1.4.2 Lambda表达式实现函数式接口1.4.3 简化Lambda表达式1.4.…

C++学习/复习4--与类相关的概念/默认成员函数/运算符重载/Date类实现案例

一、类和对象 1.本章概要 2.C中的结构体(struct与class) 升级为类 (1)类及成员函数的两种定义方式 声明与定义分离 (2)权限 注意1:struct/class在权限上的区别 (3)封装 (4&#x…

AI学习指南数学工具篇-凸优化之对偶性与拉格朗日对偶

AI学习指南数学工具篇-凸优化之对偶性与拉格朗日对偶 在凸优化中,对偶性是一个非常重要的概念。通过对偶性,我们可以将原始问题转化为对偶问题,从而更容易求解。其中,拉格朗日对偶问题是对偶性的一个重要应用,通过拉格…

《Ai学习笔记》自然语言处理 (Natural Language Processing):机器阅读理解-基础概念解析01

自然语言处理 (Natural Language Processing): NLP四大基本任务 序列标注: 分词、词性标注 分类任务: 文本分类、情感分析 句子关系:问答系统、对话系统 生成任务:机器翻译、文章摘要 机器阅读理解的定义 Machi…

LangChain - 建立代理

本文翻译整理自:Build an Agent https://python.langchain.com/v0.2/docs/tutorials/agents/ 文章目录 一、说明概念 二、定义工具1、TavilyAPI参考: 2、RetrieverAPI参考:API参考: 3、工具 三、使用语言模型四、创建代理五、运行…

《安富莱嵌入式周报》第337期:超高性能信号量测量,协议分析的开源工具且核心算法开源,工业安全应用的双通道数字I/O模组,低成本脑机接口,开源音频合成器

周报汇总地址:http://www.armbbs.cn/forum.php?modforumdisplay&fid12&filtertypeid&typeid104 视频版: https://link.zhihu.com/?targethttps%3A//www.bilibili.com/video/BV1PT421S7TR/ 《安富莱嵌入式周报》第337期:超高性…

【Spring Boot】分层开发 Web 应用程序(含实例)

分层开发 Web 应用程序 1.应用程序分层开发模式:MVC1.1 了解 MVC 模式1.2 MVC 和三层架构的关系 2.视图技术 Thymeleaf3.使用控制器3.1 常用注解3.1.1 Controller3.1.2 RestController3.1.3 RequestMapping3.1.4 PathVariable 3.2 将 URL 映射到方法3.3 在方法中使用…

用户数据报协议UDP实现可靠传输的思路

一、UDP协议的特点 按照报文来分割发送。不需要建立连接和维护连接。不需要接收确认。速度较快。不确保接收的顺序和发送顺序一样。 二、用UDP实现可靠通信的思路 (一)接收时发送一个确认报文 实现接收确认的机制。 (二)每个报文腾出空间放置序号 发送时设置序号&#xff0c…

如何安装虚拟机Wmware,并且在虚拟机中使用centos系统

1. 前言 大家好,我是jiaoxingk 本篇文章主要讲解如何安装虚拟机,并且在虚拟机中安装centos系统,让windows电脑也能够使用Linux系统 2. 虚拟机的介绍 在安装Vmware之前,我们先做虚拟机的介绍 虚拟机:通过软件虚拟出来的…

Docker拉取镜像报错:x509: certificate has expired or is not yet v..

太久没有使用docker进行镜像拉取,今天使用docker-compose拉取mongo发现报错(如下图): 报错信息翻译:证书已过期或尚未有效。 解决办法: 1.一般都是证书问题或者系统时间问题导致,可以先执行 da…

用HAL库改写江科大的stm32入门例子-6-2 定时器外部时钟

实验目的: 熟悉外部时钟的应用。 实验步骤: 创建项目参照前面的文章,集成oled(没有oled,用uart串口传递也可以)选择外部时钟源时钟源参数设置编写代码: 5.1声明全局变量,如果发生定时器中断的时候,在回调…

SW 零件插入零件的重合配合

重合配合有时候会失效,可以先用距离配合代替,之后修改距离尽量接近

AI网络爬虫-自动获取百度实时热搜榜

工作任务和目标&#xff1a;自动获取百度实时热搜榜的标题和热搜指数 标题&#xff1a;<div class"c-single-text-ellipsis"> 东部战区台岛战巡演练模拟动画 <!--48--></div> <div class"hot-index_1Bl1a"> 4946724 </div> …

【bash】统计服务器信息脚本

起因 写一个bash脚本统计服务器的机器名、内网IP、CPU使用率、内存使用率、List{GPU使用率、显存} 脚本 #!/bin/bash# 主机名 hostname$(hostname) # 内网ip ip$(ip addr | grep inet | grep -v 127.0.0.1 | awk {print $2} | cut -d/ -f1) ip$(echo "$ip"|tr \n…

Excel表格在线解密:轻松解密密码,快速恢复数据

忘记了excel表格密码&#xff1f;教你简单两步走&#xff1a;具体步骤如下。首先&#xff0c;在百度搜索中键入“密码帝官网”。其次&#xff0c;点击“立即开始”&#xff0c;在用户中心上传表格文件即可找回密码。这种方法不用下载软件&#xff0c;操作简单易行&#xff0c;适…

【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化+完美使用

模版介绍 【DZ模板】价值288克米设计APP手机版DZ模板 数据本地化完美使用 腾讯官方出品discuz论坛DIY的后台设置&#xff0c;功能齐全&#xff0c;论坛功能不亚于葫芦侠&#xff0c;自定义马甲&#xff0c;自定义认证&#xff0c;自定义广告&#xff0c;完全可以打造出自己想…