## 一、定义## 一、定义正则表达式,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