正则表达式详解

正则表达式详解

## 一、定义## 一、定义正则表达式,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)
N27_sapbcsN27_sapbcs
上一篇 2017-09-20 17:47
下一篇 2017-09-20 17:49

相关推荐

  • 将两个局域网用openvpn连接起来

    考虑到我们做集群的时候需要用到可能有20台机器,可能我的要求跟别人的不一样的,我需要做20台左右的集群,不仅仅是会,而且需要非常熟练的搭建,最后通过脚步一键自动化部署安装。 目前我有两台电脑,一台可以运行7台,另一台可以运行12台左右,刚好可以满足的我的要求,但是我两台电脑都是设置的nat模式的网络,为什么我非要配置nat模式呢,根据集群架构思想,为了保证架…

    Linux干货 2017-05-01
  • 【推荐】Linux 简单部署LAMP

    Linux 简单部署LAMP: 实验环境: 1、主机系统Centos6.7_X86_64 2、DNS&CA:192.168.3.10 3、LAMP安装方式为rpm 4、主机IP:192.168.3.11提供web站点:     http://wp.neolinux.com     &nbsp…

    Linux干货 2016-06-22
  • 马哥教育网络班21期+第14周课程练习

    系统的INPUT和OUTPUT默认策略为DROP; 1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机; INPUT链 # iptables -I INPUT 1 -p tcp&nb…

    Linux干货 2016-11-14
  • N26-博客作业-week4

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 ~]# cp -r /etc/skel /home/tuser1~]# chmod -R 700 /home/tuser1 2、编辑/etc/group文件,添加组hadoop。 ~]# echo “hadoop…

    Linux干货 2017-02-26
  • HA高可用集群学习笔记

    前言   什么是HA?HA做什么用的?   HA(High Available)是高可用集群,是保证业务不中断性的有效解决方案;通常HA集群部署在多个节点,正在提供服务的节点成为活动节点,没有提供服务的是非活动节点;当活动节点发生故障,非活动节点会转为活动节点,向外提供服务,以保证业务的连续性;这就是HA。 一、HA(High Avail…

    Linux干货 2015-06-30
  • N25-第9周博客作业

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash # 统计登录用户和非登陆用户的个数 # author: han declare -i loginnum=0 declare -i nologinnum=0 whil…

    Linux干货 2017-03-10