shell 编程之正则表达式(RegularExpression,RE)以及grep应用实例

一、shell正则表达式(RegularExpression,RE)

1.正则表达式的定义

正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。

正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹 配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进 行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指 那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符 前面的字符)在目标对象中的出现模式。

正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,例如 Linux 系统中常见的文本处理器(grep、egrep、sed、awk)以及应用比较广泛的 Python 语言。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。

2.正则表达式用途

对于一般计算机用户来说,由于使用到正则表达式的机会不多,所以无法体会正则表达 式的魅力,而对于系统管理员来说,正则表达式则是必备技能之一。

正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败”等信息。这时可以通过正则表达式快速提取“有问题”的信息。如此一来,可以将运维工作变得更加简单、方便。

目前很多软件也支持正则表达式,最常见的就是邮件服务器。在 Internet 中,垃圾/广告邮件经常会造成网络塞车,如果在服务器端就将这些问题邮件提前剔除的话,客户端就会 减少很多不必要的带宽消耗。而目前常用的邮件服务器 postfix 以及支持邮件服务器的相关分析软件都支持正则表达式的对比功能。将来信的标题、内容与特殊字符串进行对比,发现 问题邮件就过滤掉。

除邮件服务器之外,很多服务器软件都支持正则表达式。虽然这些软件都支持正则表达式,不过字符串的对比规则还需要系统管理员来添加,因此正则表达式是系统管理员必须掌 握的技能之一。

3.正则表达式的分类

1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)

2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)

4.基础正则表达式的元字符

元字符 注释
^ 匹配输入字符串的开始位置。
$ 匹配输入字符串的结尾位置。
. 匹配除“\r\n”之外的任何单个字符
\ 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
* 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用 “\ *”
[] 字符集合。匹配所包含的任意一个字符。
[^] 赋值字符集合。匹配未包含的一个任意字符。
[n1-n2] 字符范围。匹配指定范围内的任意一个字符。
{n} n 是一个非负整数,匹配确定的 n 次。
{n,} n 是一个非负整数,至少匹配 n 次。
{n,m} m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次

5.扩展正则表达式的元字符

元字符 注释
+ 作用:重复一个或者一个以上的前一个字符
作用:零个或者一个的前一个字符
作用:使用或者(or)的方式找出多个字符
() 作用:查找“组”字符串
()+ 作用:辨别多个重复的组

二、grep的于egrep的用法

1、grep的用法

1.1、grep命令的常用格式为:

grep [选项] ”模式“ [文件]

1.2、grep常用选项

-E :开启扩展(Extend)的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
-c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
–color :将匹配到的内容以颜色高亮显示。
-A n:显示匹配到的字符串所在的行及其后n行,after
-B n:显示匹配到的字符串所在的行及其前n行,before
-C n:显示匹配到的字符串所在的行及其前后各n行,context

1.3、grep用法实例
[root@localhost ~]# grep "root" /etc/passwd    //显示含有root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -n "root" /etc/passwd     //显示匹配到的行号
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -vc "root" /etc/passwd  //显示不包含root的行
49
[root@localhost ~]# grep -o "root" /etc/passwd   //只显示过滤到的root字符
root
root
root
root
[root@localhost ~]# grep -A 2 "core id" /proc/cpuinfo  //显示匹配到后面两行的信息
core id         : 0
cpu cores       : 2
apicid          : 0
--
[root@localhost ~]# grep -B 2 "core id" /proc/cpuinfo   //显示匹配到前两行的信息
physical id     : 0
siblings        : 2
core id         : 0
--
[root@localhost ~]# grep -C 2 "core id" /proc/cpuinfo   //显示匹配到的前后各两行信息
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0

2、grep使用正则表达式的实例

2.1、使用行首符“^”与行尾符“$”的用法

^ 匹配输入字符串的开始位置。 在方括号表达式中使用,表示不包含该字符集合。要匹配^ 字符本身,使用 ^
$ 匹配输入字符串的结尾位置。 要匹配 $ 字符本身,请使用 “$”

[root@localhost ~]# grep -n '^root'  /etc/passwd    //过滤以root开头的行及行号
[root@localhost ~]# grep -n '^[a-z]' /etc/passwd    //过滤以小写字母开头的行及行号
[root@localhost ~]# grep -n '^[ ^a-zA-Z]' /etc/passwd  //过滤不是大、小写字母开头的行及行号
[root@localhost ~]# grep -n '\.$ ' /etc/passwd     //过滤以点结尾的行及行号
[root@localhost ~]# grep -n '^$' /etc/passwd    //过滤空行及行号
2.2、使用表示任意一个字符“.”与重复字符“*”的用法
[root@localhost ~]# grep -n 'r..t' /etc/passwd  
//查找以r开头t结尾的字符串,即共有四个字符的行。
[root@localhost ~]# grep -n 'ooo*' /etc/passwd 
//查找连续出现o两个及以上的行
[root@localhost ~]# grep -n 'roo*t'r /etc/passwd 
//查找以r开头t结尾中间包含一个及以上的o的行
[root@localhost ~]# grep -n 'r.*t' /etc/passwd 
//查找以r开头以t结尾的行     “.*”表示匹配任意字符
[root@localhost ~]# grep -n '[0-9][0-9]*' /etc/passwd 
//查找含有数字的行
2.3、使用中括号“[ ]”来查找集合字符的用法
[root@localhost ~]# grep -n 'sh[io]rt' /etc/passwd    
//匹配以sh开头rt结尾,并且中间为i或o的行。  就是含有short或shirt的行
[root@localhost ~]# grep -n '[^w]oo' /etc/passwd
//匹配不是w开头且含有两个oo的行
[root@localhost ~]# grep -n '[^a-z]oo' /etc/passwd
//匹配不是小写字母开头且含有两个oo的行
[root@localhost ~]# grep -n '[0-9]' /etc/passwd
//匹配含有数字的行
2.4、使用连续字符范围“{}”的用法

因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。

[root@localhost ~]# grep -n 'o\{2\}' /etc/passwd 
  //查询连续出现两个o的行
[root@localhost ~]# grep -n 'ro\{2,5\}t' /etc/passwd  
//查询以r开头以t结尾,中间包含 2~5 个o的字符串。
[root@localhost ~]# grep -n 'ro\{2,\}t' /etc/passwd    
//查询以r开头以d结尾,中间包含2个或2个以上o的字符串。

3、egrep的用法

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

  • “+” 作用:重复一个或者一个以上的前一个字符
[root@localhost ~]# egrep -n 'ro+t' /etc/passwd   
//查询以r开头以d结尾,中间包含2个或2个以上o的字符串的行。
  • “?” 作用:零个或者一个的前一个字符
[root@localhost ~]# egrep -n 'bes?t' /etc/passwd
  • "|"作用:使用或者(or)的方式找出多个字符
[root@localhost ~]# egrep -n 'of|is|on' /etc/passwd
//查询含有"of"或者"if"或者"on"字符串的行
  • “()” 作用:查找“组”字符串
[root@localhost ~]# egrep -n 't(a|e)st' /etc/passwd
//查询以t开头st结尾中间含有一个字符为a或者e的字符的行,即可查询"tast"或者"test"字符串
  • "()+"作用:辨别多个重复的组
[root@localhost ~]# egrep -n '0(12)+2' /etc/passwd
//查询以0开头以2结尾的,中间包含一个及以上重复的行"12"的行。

猜你喜欢

转载自blog.csdn.net/wulimingde/article/details/108242157
今日推荐