Linux系统学习之正则表达式

简介: 一、基础的正则表达式1."."(一个点)符号点符号用于U匹配除换行符号之外的任意一个字符。例如:r.t可以匹配rot、rut,但是不能匹配root,但如果使用r..t,就可以匹配root、ruut、r  t(中间是两个空格)等。

一、基础的正则表达式

1."."(一个点)符号

点符号用于U匹配除换行符号之外的任意一个字符。例如:r.t可以匹配rot、rut,但是不能匹配root,但如果使用r..t,就可以匹配root、ruut、r  t(中间是两个空格)等。

2.“*”符号

"*"号用于匹配前一个字符0次或任意多次,比如ab*,可以匹配a、ab、abb等。"*"号经常和"."符号加在一起使用。比如".*"代表任意长度的不包含换行的字符。

3.“{n,m\}"符号

虽然"*"可用于重复匹配前一个字符,但却不能精确地控制匹配的重复次数,使用"\{n,m\}"符号则能更加灵活地控制字符的重复次数,典型的有以下三种形式:

\{n\} 匹配前面的字符n次。下列匹配的是包含root的行(r和t中包含两个o)

[root@Cfhost-170820-UCNK ~]# grep 'ro\{2\}t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

  

\{n,\}匹配前面的字符至少n次以上(含n次)

[root@Cfhost-170820-UCNK ~]# grep 'ro\{0,\}t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

\{n,m\}匹配前面的字符n到m次

4."^"这个符号位于数字键盘6的上面,又称尖角号。这个符号用于匹配开头的字符。比如说"^root" 匹配的是以字母root开始的行

[root@Cfhost-170820-UCNK ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

 5.“$"符号

和上面的尖角号相对,“$"用于匹配尾部,比如说"abc$"代表的是以abc结尾的行。如果是"^$"则代表该行为空,因为^和$间什么都没有。下例匹配的是以r开头,中间有一串任意字符,以h结尾

[root@Cfhost-170820-UCNK ~]# grep '^r.*h$' /etc/passwd
root:x:0:0:root:/root:/bin/bash

6."[]"符号

这是一对方括号,用于匹配方括号出现的任一字符。比如说单选题的答案,可能是ABCD选项中的任意一个,正则表达式表示的就是[ABCD].如果遇到比较大范围的匹配,比如说要匹配任意一个大写字符,就需要使用"-"号做范围限定,写成[A-Z],要匹配所有字母则写成[A-Za-z].一定要注意,这里的”-“的作用不是充当一个字符。

如果是要匹配不是大写字母A、B、C、D的字符又该怎么写?还记得上面的"^"号吗?如果这个符号出现在[]中,则代表取反,也就是不是的意思。那这里的写法就是[^A-D],事情变得有点复杂了。

  这里举个例子,看如何匹配手机号。手机号是11位连续的数字,第一位一定是1,所有表示"^1";第二位有可能是3(移动)或8(联通),表示为"[38]";后面连续9个任意数字,表示为

"[0-9]\{9\}";所以整个表达式应该写为"^[38][0-9]\{9\}"

7."\"符号|
假设有一个固定电话号码021-88888888,当然也可以写成 021 88888888(区号和电话号码之间用空格隔开),它们的不同之处就是区号和电话号码之间使用的符号不同,一个是
“-”,一个是空格。那么,对于这个电话号码要怎么匹配呢?很容易地想起应该使用"[]"来匹配。但是这么写:[-]是不对的,因为"-"放到"[]"中有特别含义。为了表示其作为一个字符的本意,就要使用"\"符了,这个符号代表转义字符,我们可以对很多特殊的字符进行“转义”,让它只代表字符本身,因此这里的写法就是[\ \-].

再举个例子,之前我们了解到".*"代表的是任意长度的不包括换行的重复字符。但是如果想要匹配任意长度的点号呢?这时我们用转义字符就对了:“\.*"。如果想要对”\"符号进行转义,就可以这样写:“\\"。

8."\<"符号和"\>"符号

这两个符号分别用于界定单词的左边界和右边界。birushuo"\<hello"用于匹配以”helo"开头的单词;而"hell\>"则用于匹配以"hello"结尾的单词。还可以2使用它们的组合“\<\>"用于精确匹配一个字符串。所以”\<hello\>"可精确匹配单词"hello",而不是helloworld等。如下所示:

[root@Cfhost-170820-UCNK ~]# echo "hello" | grep '\<hello\>'
hello
[root@Cfhost-170820-UCNK ~]# echo "hellod" | grep '\<hello\>'
#//没有输出,表示匹配不成功

9.”\d"符号

匹配一个数字,等价于[0-9],使用grep匹配这种正则表达式时,可能会遇到无法匹配的问题,示例如下:

[root@Cfhost-170820-UCNK ~]# echo 123 | grep [0-9]
123
[root@Cfhost-170820-UCNK ~]# echo 123 | grep '\d'
#没有输出,表示匹配不成功,为什么呢?
#这是因为"\d"是一种Per1兼容模式的表达式,又称作PCRE,要想使用这种模式的匹配符,需要加上-P参数

  [root@Cfhost-170820-UCNK ~]# echo 123 | grep -P '\d'
  123

 10.“b"符号

匹配单词的边界,比如"\bhello\b"可精确匹配"hello"单词

[root@Cfhost-170820-UCNK ~]# echo "hello world" |grep '\bhello\b'
hello world
[root@Cfhost-170820-UCNK ~]# echo "helloworld" |grep '\bhello\b'
#这里没有匹配

11."\B"符号

匹配非单词的边界,比如hello\B可以匹配"helloworld“中的"hello"

[root@Cfhost-170820-UCNK ~]# echo "helloworld" |grep 'hello\B'
helloworld

12."\w"符号

匹配字母、数字、下划线,等价于[A-Za-z0-9]

[root@Cfhost-170820-UCNK ~]# echo "a" | grep '\w'
a
[root@Cfhost-170820-UCNK ~]# echo "\\" | grep '\w'

14."\n"符号

匹配一个换行符

15.”\r"符号

匹配一个回车符

16."\t"符号

匹配一个制表符

17."\f"符号

匹配一个换页符

18."\s"符号

匹配任何空白字符

19."\S"符号

匹配任何非空白字符

二、扩展的正则表达式

“?”符号

"?"符号用于匹配前一个字符0次或1次,所以"ro?t"仅能匹配rot或rt

“+”符号

"+"符号用于匹配前一个字符1次以上,所以"ro+t"就可以匹配rot、root等

"|"符号

"|" 符号是"或"的意思,即多种可能的罗列,彼此间是一种分支关系。比如说有些地区固定电话的区号是4位数,有些地方却是3位数,这样针对不同的区号就有不同的固定电话的表示如:

#区号是3位的固定电话的正则表达式方式

^0[0-9]\{2\}-[0-9]\{8\}

#区号是4位的固定电话的正则表达式方式

^0[0-9]\{3\}-[0-9]\{8\}

#两种区号的固定电话号码可以如下写:

^0[0-9]\{2,3}-[0-9]\{8\}

#使用"|"符号业可以,但是显然比上面的方式麻烦

^0[0-9]\{2\}-[0-9]\{8\}|^0[0-9]\{3\}-[0-9]\{8\}

#"()"符号

"()符号通常需要和"|"符号联合使用,用于枚举一系列可替换的字符。比如说固定电话的区号和电话号码之间,可能用"-"符号或者用一个空格连接,用于匹配的正则表达式如下:

^0[0-9]\{2,3\}(-1)[0-9]\{8\}

^0[0-9]\{2,3\}[\ \-] [0-9]\{8\}

虽然以上两种写法没有本质的不同,因为"()"和"|"可以和"[]"相互混用,但是在某些场景下,"()"和"|"可以做的更多,比如说像hard、hold或hood等这类开头和结尾的字母都一样的单词,要匹配这些就必须使用"()"和"|"了。如下所示:

h(ar|oo|ol)d

 三、通配符

实际上,通配符是一种特殊的语句·1,主要包含"*"号和"?"号(还有"{}"、“^"、”!“)。主要用来模糊搜索文件,使用它来代替一个或多个真正的字符,尤其是在不知道或者不确定完整的文件名时,用来匹配符合条件的文件。

”*“符号:

这里的*就是提到的第一个通配符,代表0个或多个字符。

”?“符号

如果要列出以字母A开头、但是只有两个字母的文件名、以.doc结尾的文件,就需要使用"?"了。当它作为通配符使用时,代表的是任意一个字符。

”{}"符号:

"{}"可拥有匹配所有括号内包含的以逗号隔开的字符。

目录
相关文章
|
2月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
221 3
Linux系统禁用swap
|
2月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
328 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
293 0
Linux系统初始化脚本
|
3月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
234 18
|
2月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
283 1
|
2月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1005 1
|
3月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1569 10
|
3月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
568 0
|
3月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
294 0
|
3月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
474 0