Shell 正则表达式基础(一)

前言:

正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式。基础正则表达式是常用的正则表达式的最基础的部分。在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,而 egrep 与 awk 支持扩展正则表达式。掌握基础正则表达式的使用方法,首先必须了解基本正则表达式所包含的元字符的含义,下面通过 grep 命令以举例的方式逐个介绍。

一、基础正则表达式

环境:我们先准备一个test.txt文档,内容如下:

he was short and fat.
He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words


#woood # #woooooood # AxyzxyzxyzxyzC
I bet this place is really spooky late at night! Misfortunes never come alone/single.
I shouldn't have lett so tast.
1.1 查找特定字符

常用参数:

-i 不区分大小写

-v 反向查找

-n 显示行号

-i 表示不区分大小写

若反向选择,可以通过 “-vn”选项实现

示例1:

方式一:使用grep过滤查询test.txt中包含“the”的行
在这里插入图片描述
方式二:使用grep过滤查询test.txt中包含“the”的行(不区分the的大小写)
在这里插入图片描述
示例2:

取反,使用grep过滤查询test.txt中包不包含“the”的行:
在这里插入图片描述

1.2 利用中括号“[]”来查找集合字符

以查找 “shirt” 与 “short” 两个字符串为例,我们可以使用中括号查找集合字符的方式同时查找到这两个字符串。

示例1:

命令:grep -n ‘sh[io]rt’ test.txt

中括号 [] 有几个字符都仅代表一共字符。

命令含义:搜索test.txt,过滤出以sh开头rt结尾中间为 i 或者o构成的单词,并以行显示
在这里插入图片描述

示例2:

若要查找包含重复单个字符“oo”时,只需要执行以下命令:
在这里插入图片描述

示例3:

若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现,例如:
在这里插入图片描述

示例4:

若不希望“oo”前面存在大小写字母,可以使用以下命令进行过滤:
在这里插入图片描述

同时如果查找包含数字的行可以通过“grep -n ’[0-9]‘ test.txt“命令来实现:
在这里插入图片描述

1.3 查找行首 ”^“ 与行尾字符 ”$“

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

示例1:

过滤并以行输出test.txt中以“the”开头的内容
在这里插入图片描述

示例2:

查询以大小写字母开头的行可以通过以下 规则来过滤:
在这里插入图片描述
若查询不以字母开头的行则使用以下规则:
在这里插入图片描述

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

示例3:

输出以"."结尾的行:
在这里插入图片描述

示例4:

当查询空白行时,执行"grep -n ’^$‘ test.txt"
在这里插入图片描述

1.4 查找任意一共字符”.“与重复字符”*“

在正则表达式中小数点(.)也时一个元字符,代表任意一个字符。例如,执行以下命令就可以查找以w开头d结尾,中间两个字符的词:
在这里插入图片描述

在上述结果中,”wood“字符串”w…d“匹配规则。若想要查询oo、ooo、ooooo等资料,则需要使用星号”*“元字符。但需要注意的是,”星号“代表的是重复零个或多个前面的单字符。”o⭐“表示拥有零个(即为空字符)或大于等于一个”o“的字符,因为允许空字符,所以执行”grep -n ‘o⭐’ test.txt“命令会将文本中所有的内容都输出打印,如果是”oo⭐“,则第一个o必须存在,第二个o则是零个或多个o;所以凡是包含o、oo、ooo、ooo,等的资料都符合标准,同理,若查询包含至少两个o以上的字符串,则执行”grep -n ‘ooo⭐‘ test.txt"命令即可。

示例1

以显示行的形式过滤test.txt文件中至少包含2个o及以上的字符串:
在这里插入图片描述
示例2:

查询以w开头d结尾,中间包含至少一个o的字符串,执行一下命令实现:
在这里插入图片描述
示例3:

查询以w开头d结尾,中间的字符可有可无的字符串:
在这里插入图片描述
示例4:

查询任意数字所在的行:
在这里插入图片描述

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

在上文的示例中,我们使用”.“ 与”*“来设定零个到无线多个重复的字符,如果想要限制一共范围内的重复的字符串,我们可以使用{}来查找连续字符范围,例如,如果我们要查找3到5个o的连续字符,此时就需要使用基础正则表达式中的限定范围的字符”{}“。因为”{}“在Shell中具有特殊的意义,所以我们在使用”{}“字符时,需要利用转义符”\“,将”{}“字符转换成普通字符。

示例1:

查询两个o的字符:
在这里插入图片描述

示例2:

查询以w开头,以d结尾,中间包含2~5个o的字符串:
在这里插入图片描述

示例3:

查询以w开头以d结尾,中间包含2个以上o的字符串。
在这里插入图片描述

1.6 元字节总结:

通过以上几个示例,我们将常见的基础正则表达式的元字符包括以下:
在这里插入图片描述

二、 扩展正则表达式

通常使用基础正则表达式就已经足够,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式。例如,使用基础正则表达式查询除文件中空白行与行首为“#”之外的行(通常用查看生效的配置文件),执行“grep -v ’^$‘

test.txt | grep -v ’^#‘ ” 即可实现。这里需要使用管道命令来搜索两次。如果使用扩展正则表达式,可以简化为 “ egrep -v ’$|#‘ test.txt ” ,其中,单引号内的管道符号表示或者(or)。

此外,grep命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用egrep或awk命令。这里我们直接用egrep命令。egrep命令与grep命令的用法基本相似。egrep命令是一共搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串,一个提示符可以是单个字符、一个字符串、一共字或一个句子。

2.1 扩展正则表达式的常用元字符

常用元字符:
在这里插入图片描述

2.2 查找一个或者一个以上的前一个字符“+”

示例:
在这里插入图片描述

2.2.1 查找零个或一个前一个字符“?”

示例:
在这里插入图片描述

2.3 使用或者(or)的方式找出多个字符“|”

示例:
在这里插入图片描述

2.4 查找“组”字符串 “()”

示例:
在这里插入图片描述

2.5 辨别多个重复的组“()+”

示例:
在这里插入图片描述

2.6 egrep小结

egrep中:"?" 加上“+”的功能相当于grep中的“*”的功能

egrep是扩展正则表达式,同时可以使用普通正则表达式grep的元字符。

示例:
在这里插入图片描述

总结:

本篇博客暂介绍grep与egrep中元字符对应的功能及实验,近日会进行更新介绍文本处理器的功能。

发布了48 篇原创文章 · 获赞 46 · 访问量 6619

猜你喜欢

转载自blog.csdn.net/weixin_45726050/article/details/103361979