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

正则表达式概述

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

基础正则表达式

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

1,基础正则表达式示例

以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

猜你喜欢

转载自blog.51cto.com/14080162/2440843