Linux Shell 脚本编程学习之【第3章 正则表达式 (第一部分)】

第3章 正则表达式

  • [1 正则表达式基础](#1 正则表达式基础)
    • [1.1 *符号](#1.1 *符号)
    • [1.2 "."符号](#1.2 “.”符号)
    • [1.3 "^"符号](#1.3 “^”符号)
    • [1.4 ""符号](#1.4 “”符号)
    • [1.5 "[]"符号](#1.5 “[]”符号)
    • [1.6 "\"符号](#1.6 “\”符号)
    • [1.7 "\<\>"符号](#1.7 “<>”符号)
    • [1.8 "\{\}"符号](#1.8 “{}”符号)
  • [2 正则表达式扩展](#2 正则表达式扩展)
    • [2.1 "?"符号](#2.1 “?”符号)
    • [2.2 "+"符号](#2.2 “+”符号)
    • [2.3"()"符合和" | "符号](#2.3“()”符合和“ | ”符号)
  • [3 通配(Globbing)](#3 通配(Globbing))

1 正则表达式基础

1、正则表达式是由一串字符和元字符构成的字符串,简称 RE(Regular Expression)。

2、正则表达式起到数据过滤作用。

3、POSIX 标准将正则表达式分为两类:基本的正则表达式和扩展的正则表达式,大部分 Linux 应用和工具仅支持基本的正则表达式。

Linux Shell 以一串字符作为表达式向系统传达意思。元字符 (Metacharacters) 是用来阐 释字符表达式意义的字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内 容、转换及各种操作信息进行描述。正则表达式是由一串字符和元字符构成的字符串,简称 RE(Regular Expression)。 正则表达式的主要功能是文本查询和字符串操作,它可以匹配文 本的一个字符或字符集合。

基本的正则表达式元字符集合及其意义

符 号 意 义
* 0个或多个在*字符之前的那个普通字符
. 匹配任意字符
A 匹配行首,或后面字符的非
$ 匹配行尾
1 匹配字符集合
\ 转义符,屏蔽一个元字符的特殊意义
< 精确匹配符号
\n} 匹配前面字符出现n次
{n,N) 匹配前面字符至少出现n次
\n,m} 匹配前面字符出现n~m次

一些举例:

1.1 *符号

sql 复制代码
"*"符号用于匹配前面一个普通字符的0次或多次重复,如:
-----
hel*o
-----
"*"符号前面的普通字符是l,*字符就表示匹配l字符0次或多次,如字符串helo、hello、hellllllo 都可以由 hel*o来表示。

1.2 "."符号

sql 复制代码
点号". "用于匹配任意一个字符,如:
-----
..73.
-----
由于". "符号只能匹配一个字符,因此,上述字符串表示前面三个字符为任意字符,第4和第5个字符是7和3,最后一个字符为任意字符,如xcb738、4J973U 都能匹配上述字符串。值得注意的是,"."符号可以匹配一个空格,因此, xb738、ui73e 也能匹配上述字符串。

1.3 "^"符号

sql 复制代码
"^"符号用于匹配行首,表示行首的字符是"^"字符后面的那个字符,如:
-----
^cloud
-----
这表示匹配以cloud开头的行。结合上面介绍的"*"符号和". "符号,再举一个例子:
-----
^.X86*
-----
该字符串表示行首的三个字符为任意字符(可以是空格),第4~6个字符为 X86, 第 7个字符开始可以重复匹配6,如:866X86666、86X86  都可以匹配上述字符串。

1.4 "$"符号

sql 复制代码
$符号匹配行尾,$符号放在匹配字符之后,与"A"符号的功能和用法都相反,如:
-----
micky$
-----
该正则表达式表示匹配以micky 结尾的所有行。 一个特殊的正则表达式是匹配所有空行的表达式,为:
-----
^$
-----
该正则表达式既匹配行首,又匹配行尾,中间没有任何字符,因此,为空行。
如果需要匹配只包含一个字符的行,如下面的例3-7所示:
-----
^.$
-----

1.5 "[]"符号

sql 复制代码
方括号[]匹配字符集合,该符号支持穷举方法列出字符集合的所有元素,也支持使用"- " 符号表示字符集合范围,表明字符集合范围从" "左边字符开始,到"   "右边字符结束。举例
-----
[0123456789]   --任意字符
[0-9]   --任意字符
[a-z]   #所有小写字母
[A-Z]   #所有大写字母
[b-p]   #小写字母b~p
[^b-d]  #^表示取反,即除了字母b~p之外的字母。
[A-Za-z][A-Za-z]*    #匹配所有的英文单词
-----

1.6 "\"符号

sql 复制代码
"\"符号是转义符,用于屏蔽一个元字符的特殊意义,即以字面含义来解释"\"符号后 面的元字符,如:
-----
\.
-----
反斜杠后面的字符"."是元字符,经过转义后,". "不再表示任意一个字符,而是一个 普通字符句号". "。转义符"\"是引用符的一种

1.7 "<>"符号

sql 复制代码
"\<>"符号是精确匹配符号,该符号利用"\"符号屏蔽"◇"符号,如:
-----
\<the\>
-----
该正则表达式精确匹配the这个单词,而不匹配包含 the字符的单词,如 them、there、another等。

1.8 "{}"符号

sql 复制代码
"\{\}"系列符号与"*"符号类似,都是表示前一个字符的重复。但是,"*"符号表示 重复0次或任意次,而"\{\}"系列符号可以指定重复次数,"\{\}"系列符号包括以下三种 形式。
●  \{n\}: 匹配前面字符出现n 次。
● \{n,\}: 匹配前面字符至少出现n 次。
● \{n,m\}: 匹配前面字符出现n~m 次。
举例:
-----
O\{3\}B      #重复字符03次
JO\{3,\}B    #重复字符o 至少3次
JO\{3,6\}B   #重复字符03~6次
[a-z]\{5\}  #表示精确匹配5个小写英文字母,比如 hello、house等。
-----
JO\{3\}B表示重复字符03次,匹配值为: JOOOB。
JO\{3,\}B 表示重复字符O 至少3次, JOOOB、JOOOOB、JOOOOOB等字符串都可由该正则表达式来匹配。
JO\{3,6\}B 表示重复字符O至少3次,至多6次, JOOOB、JOOOOOOB 等字符串都满足,但是JOOB、JOOO000OB等字符串就不满足。

2 正则表达式扩展

符 号 意 义
? 匹配0个或1个在其之前的那个普通字符
+ 匹配1个或多个在其之前的那个普通字符
0 表示一个字符集合或用在expr中
I 表示"或",匹配一组可选的字符

2.1 "?"符号

sql 复制代码
匹配"?"符号之前的那个字符0次或1次,如:
-----
JO?B
-----
该表达式表示匹配O 字符0次或1次,即匹配JOB 或JOOB。 需要注意的是,"?"字符
至多可以匹配1个字符。

2.2 "+"符号

sql 复制代码
与"*"符号类似,都是匹配其前面的那个字符多次,但是,"*"符号可以匹配0次,而 "+"符号至少匹配1次,如:
-----
S+EU
-----
该表达式表示匹配S1 次或任意次, SSEU、SSSSEU 等字符串都可由该表达式进行匹配, 而SEU 却不能由S+EU 来匹配。

2.3"()"符合和" | "符号

sql 复制代码
"()"符号通常与"I"符号结合使用,表示一组可选字符的集合,如:
-----
re(a|e|o)d
-----
该表达式中的(a|e|o)表示在字符 a、e和 o 中选择任意一个字符,即 read、reed、reod 都 可由该表达式进行匹配。
事实上,()符号很少使用到,因为"[]"符号完全能够替代"()"符号表示一组可选字符 的集合, re(alelo)d 就等价于 re[aeo]d。
" | "符号也可以表示多个正则表达式的"或"关系,基本格式为:
-----
RE1 | RE2 | RE31 |...
-----
上述格式中, RE1、RE2 和 RE3 表示正则表达式。
"|"符号在扩展的正则表达式中表示"或"意义,遗憾的是, "|"符号的这种用法却很少 被人记住,"|"符号最著名的是其管道符用法.

3 通配(Globbing)

bash Shell 可以使用正则表达式中的一些元字符实现通配 (Globbing) 功能,通配是把一个包含通配符的非具体文件名扩展存储在计算机、服务器或者网络上的一批具体文件名的过程。

最常用的通配符包括正则表达式元字 符:?、、[]、{}、^等。这些元字符在通配中的意义与正则表达式中的意义不完全一致, 符号不再表示其前面字符的重复,而是表示任意位的任意字符,?字符表示一个任意字符, A 符号在通配中不代表行首,而是代表取反。

sql 复制代码
ls -l [a-h]*.awk
ls -l  {[a-h]*.awk,0?.pem}      #满足[a-h]*.awk 或0?.pem 的所有文件

黑客输入包含通配符的文件名故意让服务器重复和连续不断地进行通配 可能引起的拒绝服务攻击。因此,大型服务器经常通过限制服务器执行通配功能的次数、限 制一个具体用户每次输入的通配符或者如果通配符太普通,则拒绝执行通配等方法来提高服 务器的安全性。

相关推荐
小陈的进阶之路33 分钟前
Linux自主学习篇
学习
咩咩大主教44 分钟前
Linux下的简单TCP客户端和服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·网络编程
小理想!1 小时前
如何在Linux Centos7系统中挂载群晖共享文件夹
linux·运维·服务器
日晨难再1 小时前
Linux:终端(terminal)与终端管理器(agetty)
linux·运维·服务器
ps酷教程2 小时前
elasticsearch学习(一)
学习·elasticsearch·jenkins
赵渝强老师2 小时前
【赵渝强老师】K8s的DaemonSets控制器
linux·docker·云原生·容器·kubernetes
wangsir.2 小时前
linux之进程信号
linux·信号处理
麒麟而非淇淋2 小时前
Node.js 学习
学习·node.js
江西昊仔3 小时前
Docker指令学习1
学习·docker·eureka
Dola_Pan3 小时前
Linux文件IO-基础知识了解及文件描述符
linux·运维·服务器