正则表达式详解

正则表达式详解

## 一、定义## 一、定义正则表达式,Regular Expression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
## 二、分类(1) 基本正则表达式:BRE,Basic RE(2) 扩展正则表达式:ERE,Extended RE
## 三、元字符上述二者的元字符不同,说到元字符,要介绍一下它的概念:元字符:meta character, 不能够再被分割,用于表达通配或控制的功能。
有一些还有一些特殊的通配符,还需要再加上[]才能使用,这些也支持取反格式:[^[]]
通配符号 | 含义———— | —— [:space:] | 空白字符[:punct:] | 标点符号[:lower:] | 所有小写字母[:upper:] | 所有大写字母[:alpha:] | 所有大小写字母[:digit:] | 所有数字[:alnum:] | 所有数字和大小写字母
**1. 基本正则表达式的元字符****(1) 字符匹配**
符号 | 含义—— | ——. | 匹配任意单个字符[] | 匹配指定范围内的任意单个字符[^] | 匹配指定范围外的任意单个字符示例:`~]# grep “r[[:alpha:]][[:alpha:]]t” /etc/passwd`在/etc/passwd文件中,匹配r和t之间只能出现两个字母的行。**(2) 匹配次数**用在要制定其出现的次数的字符的后面,用于限制其前面字符出现的字数
符号 | 含义—— | ——* | 匹配前面的字符任意次,0次,1次,多次均可.* | 匹配任意长度的任意字符\\? | 匹配其前面的字符0次或1次,即前面的字符是可有可无的\\+ | 匹配其前面的字符1次或多次,即前面的字符要出现至少一次\\{m\\} | 匹配其前面的字符m次\\{m,n\\} | 匹配其前面的字符至少m次,至多n次其中,”\\”符号仅用于基本正则表达式匹配,如果扩展正则表达式则不需要”\\”做转义。
> 正则表达式默认工作在贪婪模式例如,grep “r.*” /etc/passwd,在匹配时,会匹配r字符开头一直到最后的所有字串。
**(3) 位置锚定**使用场景:有时需要限定匹配的字符串只能出现在一行的某个位置,则需要使用位置锚定
符号 | 含义—— | ——^ | 行首锚定,用于模式的最左侧$ | 行尾锚定,用于模式的最右侧^PATTERN$ | 用模式匹配整行^$ | 匹配空白行,不包括任何字符,包括空格\\< 或 \\b | 词首锚定,用于单词模式的左侧\\> 或 \\b | 词尾锚定,用于单词模式的右侧\\<PATTERN\\> | 精确匹配单词
练习题:(1) 显示/etc/passwd文件中,不以/bin/bash结尾的行;`~]# grep -v “/bin/bash$” /etc/passwd`(2) 找出/etc/passwd文件中的两位数或三位数;`~]# grep “\<[[:digit:]]\{2,3\}\>” /etc/passwd`(3) 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中以至少一个空白字符开头,且后面存在非空白字符的行;`~]# grep “^[[:space:]]\+[^[:space:]]\+” /etc/rc.d/rc.sysinit`(4) 找出“netstat -tan”命令的结果中,以“LISTEN”后跟0、1或多个空白字符结尾的行;`~]# netstat -tan | grep “\<LISTEN[[:space:]]*$”`**(4) 分组及引用**使用场景:- 有时需要匹配多个字符的组合出现0、1或多次,这就需要将这多个字符组成一组,一起进行后续的次数匹配或位置锚定;- 有时需要让前面匹配到的字符串后面再次出现;
**分组符号:**\\(PATTERN\\) : 将某个匹配模式分组,例如\\(xy\\)*ab,表示前面的xy是一个整体,可以一起出现0、1或多次。> 注意:括号可嵌套,但不可交叉!
**引用符号:**分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为\1, \2, \3 …,其中
符号 | 含义—— | ——\1 | 模式从左侧起,第一个括号以及与之匹配的右括号之间的模式所匹配到的字符;\2 | 模式从左侧起,第二个括号以及与之匹配的右括号之间的模式所匹配到的字符;\3 | 模式从左侧起,第三个括号以及与之匹配的右括号之间的模式所匹配到的字符;示例:编辑一个文件,其中包含如下内容:He loves his lover.He likes his lover.She like her liker.She loves her liker.并筛选出前后两个lxxe字段在同一行中是相同的字段。“`~]# vim lover.txtHe loves his lover.He likes his lover.She like her liker.She loves her liker.~]# grep “\(l..e\).*\1” lover.txtHe loves his lover.She like her liker.“`**2.扩展正则表达式的元字符**egrep,支持扩展的正则表达式实现类似于grep文本过滤功能,功能与grep -E相同。**(1) 字符匹配**

符号 | 含义—— | ——. | 匹配任意单个字符[] | 匹配指定范围内的任意单个字符[^] | 匹配指定范围外的任意单个字符
**(2) 匹配次数**用在要制定其出现的次数的字符的后面,用于限制其前面字符出现的字数
符号 | 含义—— | ——* | 匹配前面的字符任意次,0次,1次,多次均可.* | 匹配任意长度的任意字符? | 匹配其前面的字符0次或1次,即前面的字符是可有可无的+ | 匹配其前面的字符1次或多次,即前面的字符要出现至少一次{m} | 匹配其前面的字符m次{m,n} | 匹配其前面的字符至少m次,至多n次
**(3) 位置锚定**使用场景:有时需要限定匹配的字符串只能出现在一行的某个位置,则需要使用位置锚定
符号 | 含义—— | ——^ | 行首锚定,用于模式的最左侧$ | 行尾锚定,用于模式的最右侧^PATTERN$ | 用模式匹配整行^$ | 匹配空白行,不包括任何字符,包括空格\\< 或 \\b | 词首锚定,用于单词模式的左侧\\> 或 \\b | 词尾锚定,用于单词模式的右侧\\<PATTERN\\> | 精确匹配单词
**(4) 分组及引用**使用场景:- 有时需要匹配多个字符的组合出现0、1或多次,这就需要将这多个字符组成一组,一起进行后续的次数匹配或位置锚定;- 有时需要让前面匹配到的字符串后面再次出现;
**分组符号:**(PATTERN) : 将某个匹配模式分组,例如(xy)*ab,表示前面的xy是一个整体,可以一起出现0、1或多次。> 注意:括号可嵌套,但不可交叉!
**引用符号:**分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为\1, \2, \3 …,其中
符号 | 含义—— | ——\1 | 模式从左侧起,第一个括号以及与之匹配的右括号之间的模式所匹配到的字符;\2 | 模式从左侧起,第二个括号以及与之匹配的右括号之间的模式所匹配到的字符;\3 | 模式从左侧起,第三个括号以及与之匹配的右括号之间的模式所匹配到的字符;
**(5) 或者符号“|”**或者符号“|”代表是的该符号整个左侧和整个右侧。例如:
表现形式 | 含义———— | ——a \| b | 表示a或者bC \| cat | 表示C或者cat(C \| c)at | 表示Cat或cat
egrep练习题:(1) 显示/etc/passwd文件中,不以/bin/bash结尾的行;`~]# egrep -v “/bin/bash$” /etc/passwd`(2) 找出/etc/passwd文件中的两位数或三位数;`~]# egrep “\<[[:digit:]]{2,3}\>” /etc/passwd`(3) 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中以至少一个空白字符开头,且后面存在非空白字符的行;`~]# egrep “^[[:space:]]+[^[:space:]]+” /etc/rc.d/rc.sysinit`(4) 找出“netstat -tan”命令的结果中,以“LISTEN”后跟0、1或多个空白字符结尾的行;`~]# netstat -tan | egrep “\<LISTEN[[:space:]]*$”`(5) 找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少有三种实现方式。方法1:`~]# grep -i “^s” /proc/meminfo`方法2:`~]# grep -E “^(s|S)” /proc/meminfo`方法3:`~]# grep “^[sS]” /proc/meminfo`(6) 显示当前系统上root、centos或user1用户的相关信息;“`~]# grep -E “^(root|centos|user1)\>” /etc/passwdroot:x:0:0:root:/root:/bin/bashcentos:x:500:500::/home/centos:/bin/bashuser1:x:501:501::/home/user1:/bin/bash“`(7) 找出/etc/rc.d/init.d/functions文件中,某单词后面跟一个小括号的行;`~]# egrep “[_[:alnum:]]+\(\)” /etc/rc.d/init.d/functions`> 这里面要注意”[\_[:alnum:]]+\(\)” 的表达方式,代表()之前,可以是字母、数字以及_字符。
(8) 使用echo命令输出一个绝对路径,使用egrep取出其基名;`~]# echo “/etc/sysconfig/network-scripts/ifcfg-eth0” | egrep -o “[^/]+/?$” | cut -d’/’ -f1`进一步:取出其路径名。`~]# echo “/etc/sysconfig/network-scripts/ifcfg-eth0” | egrep -o “/.*/”`(9) 找出ifconfig命令结果中的1-255之间的数值;`~]# ifconfig | egrep –color=auto ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’ `(10) 找出ifconfig命令结果中的IP地址;`~]# ifconfig | egrep “\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>”`> 这个地方需要注意的就是:IP地址的特点是a.b.c.d,其中,a,d为1-254的数字;b,c为0-254的数字;
(11) 添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;“`~]# useradd bash~]# useradd testbash~]# useradd basher~]# useradd -s /sbin/nologin nologin~]# tail -4 /etc/passwdbash:x:502:502::/home/bash:/bin/bashtestbash:x:503:503::/home/testbash:/bin/bashbasher:x:504:504::/home/basher:/bin/bashnologin:x:505:505::/home/nologin:/sbin/nologin
~]# egrep “^(\<[^:]+\>).*\1$” /etc/passwdsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltbash:x:502:502::/home/bash:/bin/bashnologin:x:505:505::/home/nologin:/sbin/nologin“`> 注意:当无须用到元字符去编写模式时,使用**fgrep**必能更好!!!!

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87468

(1)
上一篇 2017-09-20 17:47
下一篇 2017-09-20 17:49

相关推荐

  • Linux命令格式及常用命令详解

    Linux命令格式及常用命令详解 Linux的命令格式 COMMAND OPTIONS ARGUMENTS COMMAND 表示要执行的命令 OPTIONS 表示命令的运行特性 RGUMENTS 命令的作用对象,有时可以包含多个对象,空格隔开 常用命令详解 ifconfig 功能描述:获取网络接口配置信息或配置网络接口 命令格式: ifconfig [-a]…

    Linux干货 2017-07-02
  • 计算机的组成

        计算机组成(computer composition)指的是系统结构的逻辑实现,包括机器机内的数据流和控制流的组成及逻辑设计等。 计算机组成的任务是在指令集系统结构确定分配给硬件系统的功能和概念结构之后,研究各组成部分的内部构造和相互联系,以实现机器指令集的各种功能和特性。这种联系包括各功能部件的内部和相   &nbsp…

    2017-03-26
  • MairaDB之基于openssl的主从复制

    一、配置openssl   1、   在master server(node0)上根CA的搭建(及生成自签名证书) [root@node0 ~]# cd /etc/pki/CA/ [root@node0 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) Gen…

    2014-10-03
  • 文本处理三剑客之vim

    由于Linux中的配置文件都是以文本方式存在的,所以在Linux的系统中使用文本编辑器来配置系统是一件很重要的事情。而vim由于程序简单、编辑速度快且能够检查编程中的语法错误,所以已成为最常用也最重要的文本处理工具。下面我们就来介绍一下。 一、vim的模式 Vim在使用过程中,基本上分为三种模式:命令模式、编辑模式与扩展命令模式。在三种模式下,我们可以执行的…

    Linux干货 2016-08-12
  • 功能强大的Linux文本编辑器之Vim的使用

    VIM编辑器   Vim章节的内容:    使用vi和vim的三种主要模式    移动光标,进入插入模式    改变、删除、复制文本    撤销改变    搜索文档    vim寄存器    可视化和多窗口 &…

    Linux干货 2016-08-12
  • LVM逻辑卷管理器(Logical Volume Manager)

    逻辑卷管理器(Logical Volume Manager) 简介      LVM的做法是将几个物理的分区通过软件组合成为一块看起来是独立的大磁盘(VG),然后将这块大磁盘再分成可以使用的分区(LV),最终就能够挂载使用了。内部通过PE来进行扩展或缩小。 PV(PhysicalVolume)物理卷 用fdisk命令调整系统标识…

    Linux干货 2016-09-01