正则表达式
基本正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
1、字符匹配
- .:任意字符
- []:匹配指定范围内的单个字符
- [^]:匹配指定范围外的单个字符
- [:alnum:] 字母和数字
- [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
- [:lower:] 小写字母 [:upper:] 大写字母
- [:blank:] 空白字符(空格和制表符)
- [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
- [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
- [:digit:] 十进制数字 [:xdigit:]十六进制数字
- [:graph:] 可打印的非空白字符
- [:print:] 可打印字符
- [:punct:] 标点符号
2、匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
- *:匹配前边的字符任意次
- .*:匹配任意字符任意次,表示所有
- \?:匹配前边字符0或一次,表示前边字符可有可无
- \{m\}:匹配前边字符m次
- \{m,n\}:匹配前边字符最少m次,最多n次 \{,n\}:匹配前边字符至多n次,\{m,\}:匹配前边字符至少m次
3、位置锚定
- ^:行首锚定,用于模式的最左侧
- $:行尾锚定,用于模式的最右侧
- ^PATTERN$:用于模式匹配整行\<或\b:单词锚定,用于单词模式的左侧
- ^$:匹配空行
- ^[[:space:]]*$:匹配空白行
- \>或\b:单词锚定,用于单词模式的右侧
- \<PATTERN\>:匹配整个单词
- \(\) 分组:将多个字符捆绑一起当做一个字符用
习题 1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法) # cat /proc/meminfo |grep -i "^s" # cat /proc/meminfo |grep "^\(s\|S\)" 2、显示/etc/passwd文件中不以/bin/bash结尾的行 # grep -v "/bin/bash$" /etc/passwd 3、显示用户rpc默认的shell程序 # getent passwd rpc |grep -o "/[s]\?bin/.*" 4、找出/etc/passwd中的两位或三位数 # getent passwd |grep -o "\b[[:digit:]]\{2,3\}\b" 5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行 # cat /etc/grub2.cfg |grep "^[[:space:]]\+" |grep -v "^[[:space:]]*$" 6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行 # netstat -tan |grep "ESTABLISHED" 7、显示CentOS7上所有系统用户的用户名和UID # getent passwd |cut -d: -f1,3 8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行 # getent passwd |grep "^\(\<[[:alnum:]]*\).*/\1$" 9、利用df和grep,取出磁盘各分区利用率,并从大到小排序 df |grep "sd[a-z]" |grep -o "[0-9]\{1,3\}%" |grep -o '[[:digit:]]*'
扩展的正则表达式
正则表达式与扩展正则表达式类似,只是扩展正则表达式表达更加简单。
正则表达式需要打 \ 转义字符 来表示某些字符的意思,而扩展正则表达式则不需要:
- \{m} 正则表达式表示至少表示前面的字符m次 {m}
- \? 正则表达式表示前面的字符0或1次 ?
- \+ 正则表达式表示前面的字符至少一次 +
- \(\) 正则表达式表示分组 ()
- \| 正则表达式表示或 |
练习:
1 显示Centos7的/etc/grep2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行 cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]]" 2 找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行 netstat -tan |grep "LISTEN[[:space:]]\+$" 3 显示Centos7上所有系统用户的用户名和UID cat /etc/passwd |cut -d: -f1,3 |grep "\<[0-9]\{1,3\}\>" 4 显示三个用户root,mage,wang的UID和默认的shell cat /etc/passwd |egrep "^(root|yuan|gentoo)\b" | cut -d: -f3,7 5 找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行 cat /etc/rc.d/init.d/functions |egrep "^[_[:alnum:]]+\(\)" 6 使用egrep取出/etc/rc.d/init.d/functions中其基名 echo /etc/tc.d/init.d/functions |egrep -o "[^/]+$" 7 使用egrep取出上面路径的目录名 echo /etc/tc.d/init.d/functions | egrep -o ".*/" 8 统计last命令中以root登录的每个主机IP地址登录次数 last |grep "^root\>" |egrep -o "([[:digit:]]{1,3}.){3}[[:digit:]]{1,3}" |sort |unip -c |sort -nr 9 利用扩展正则表达式分别表示0-9,10-99,100-199,200-249,250-255 [0-9] [0-9][0-9] 1[0-9]{2} 2[0-4][0-9] 25[0-5]