Shell编程之正则表达式三剑客——grep,egrep
admin
2023-03-06 03:41:58
0次

正则表达式概述

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

基础正则表达式

正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用的正则表达式的最基础的部分。在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,而 egrep 与 awk 支持扩展正则表达式。

基础正则表达式示例

以httpd服务的配置文件为例(/etc/httpd/conf/httpd.conf)
1)查找特定字符
-n:显示行号  -i:不区分大小写
查找出目标文件中带有“the”的字符
[root@localhost conf]# grep -n 'the' httpd.conf

Shell编程之正则表达式三剑客——grep,egrep

若反向查找,查找不包含“the”字符的行,则需要通过“-vn”选项实现
[root@localhost conf]# grep -vn 'the' httpd.conf

Shell编程之正则表达式三剑客——grep,egrep

2)利用中括号“[ ]”来查找集合字符(先创建一个自定义的文本文件a.txt)
想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh” 与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串。“[]”中无论有几个字符,都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”。

#a.txt实验文本
short
shirt
oo
tools
wood
woooooood
Wood
the football
this the web
123123
456456.
[root@localhost ~]# grep -n 'sh[io]rt' a.txt

Shell编程之正则表达式三剑客——grep,egrep

若要查找包含重复单个字符“oo”时,只需要执行以下命令即可
[root@localhost ~]# grep -n 'oo' a.txt

Shell编程之正则表达式三剑客——grep,egrep

若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的

[root@localhost ~]# grep -n '[^w]oo' a.txt

Shell编程之正则表达式三剑客——grep,egrep

在上述命令的执行结果中发现“wooooood”也符合匹配规则,包含“w”。其实通过执行结果就可以看出,符合匹配标准的字符加粗显示,而上述结果中可以得知,“#wooooood #”中加粗显示的是“oooooo”,而“oo”前面的“o”是符合匹配规则的。

若不希望“oo”前面存在小写字母a-z A-Z 数字0-9
[root@localhost ~]# grep -n '[^a-z]oo' a.txt

Shell编程之正则表达式三剑客——grep,egrep

3)查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中,查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现。

[root@localhost ~]# grep -n '^the' test.txt

Shell编程之正则表达式三剑客——grep,egrep

查询以小写字母开头的行可以通过“^[a-z]”规则来过滤,查询大写字母开头的行则使用“^[A-Z]”规则,若查询不以字母开头的行则使用“^[^a-zA-Z]”规则。

[root@localhost ~]# grep -n '^[^a-zA-Z]'  a.txt

Shell编程之正则表达式三剑客——grep,egrep

“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]”符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.) 在正则表达式中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特 殊意义的字符转化成普通字符。空行使用^$即可。

[root@localhost ~]# grep -n '\.$' a.txt 

Shell编程之正则表达式三剑客——grep,egrep

4)查找任意一个字符“.”与重复字符“*”
前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如, 执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾。

Shell编程之正则表达式三剑客——grep,egrep

在上述结果中,“wood”字符串“w..d”匹配规则。若想要查询 oo、ooo、ooooo 等资料,则需要使用星号()元字符。但需要注意的是,“”代表的是重复零个或多个前面的单字符。

[root@localhost ~]# grep -n 'oo*' a.txt 

Shell编程之正则表达式三剑客——grep,egrep

查询以 w 开头 d 结尾,中间的字符可有可无的字符串。
[root@localhost ~]# grep -n 'w.d' a.txt
查询任意数字所在行。
[root@localhost ~]# grep -n '[0-9][0-9]
' a.txt

5)查找连续字符范围“{}”

查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串。
[root@localhost ~]# grep -n 'wo{2,5}d' a.txt
查询以 w 开头以 d 结尾,中间包含 2 个 o 以上的字符串。
[root@localhost ~]# grep -n 'wo{2,}d' a.txt

Shell编程之正则表达式三剑客——grep,egrep

元字符总结

常见的基础正则表达式的元字符主要包括以下几个

Shell编程之正则表达式三剑客——grep,egrep

扩展正则表达式

通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式。
grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。

扩展正则表达式常见元字符

Shell编程之正则表达式三剑客——grep,egrep

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...