(十)正则表达式、扩展正则表达式元字符

正则表达式

REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配
符功能是用来处理文件名,而正则表达式是处理文本内容中字符
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
正则表达式分两类:
基本正则表达式:BRE Basic Regular Expressions
扩展正则表达式:ERE Extended Regular Expressions
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Perl Compatible Regular
Expressions)
正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组

1、基本正则表达式元字符

1.1、字符匹配

.   匹配任意单个字符,可以是一个汉字
[]   匹配指定范围内的任意单个字符,示例:[wang]   [0-9]   [a-z]   [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang] 
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S     #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s     #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode 正则表达式会匹配全角空格符

1.2、匹配次数

用在要指定次数的字符后面,用于指定前面的字符要出现的次数

* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\}  #匹配前面的字符至多n次,<=n
\{n,\}  #匹配前面的字符至少n次

1.3、位置锚定

位置锚定可以用于定位出现的位置

^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space:]]*$ #空白行
\<\b   #词首锚定,用于单词模式的左侧
\>\b        #词尾锚定,用于单词模式的右侧
\<PATTERN\>     #匹配整个单词
#注意: 单词是由字母,数字,下划线组成

1.4、分组其它

1.4.1、分组

分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例:

\(string1\(string2\)\)
\1 :string1\(string2\)
\2 :string2

注意: 后向引用 引用前面的分组括号中的模式所匹配字符,而非模式本身

1.4.2、或者

或者:|
示例:

a\|b #a或b  
C\|cat #C或cat   
\(C\|c\)at #Cat或cat

正则表达式练习

1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)

grep "^\(s\|S\)" /proc/meminfo
或:
grep "^[sS].*" /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行

grep -v "/bin/bash$" /etc/passwd

3、显示用户rpc默认的shell程序

grep -w rpc /etc/passwd|cut -d: -f7

4、找出/etc/passwd中的两位或三位数

cat /etc/passwd |grep -o '\<[0-9]\{2,3\}\>'

5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行

egrep "^[[:space:]]+.*[^[:space:]]$" /etc/grub2.cfg

6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行

netstat -tan |grep "LISTEN[[:blank:]]*"

7、显示CentOS7上所有UID小于1000以内的用户名和UID

cut -d: -f1,3 /etc/passwd|egrep -o ".*:[0-9]{1,3}"

8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行

useradd -s /sbin/nologin bash
useradd -s /sbin/nologin testbash
useradd -s /sbin/nologin basher
useradd -s /sbin/nologin sh
useradd -s /sbin/nologin nologin
grep "^\([^:]\+\):.*\<\1$" /etc/passwd   (基础正则)
或:
egrep "^([^:]+):.*\<\1$" /etc/passwd     (扩展正则)

9、利用df和grep,取出磁盘各分区利用率,并从大到小排序

df |grep "^/dev/sd"|tr -s " "|cut -d" " -f5|sort -nr

2、扩展正则表达式元字符

2.1、字符匹配

. 任意单个字符
[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

2.2、次数匹配

*   匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次

2.3、位置锚定

^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾

2.4、分组其它

() 分组
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

扩展正则表达式练习

1、显示三个用户root、zhang、wang的UID和默认shell

egrep "^(root|mage|wang)" /etc/passwd | cut -d: -f3,7

2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行

egrep "^[a-z|_]+\>\(\).*" /etc/rc.d/init.d/functions

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

echo /etc/rc.d/init.d/functions | egrep -o [^/]+$

4、使用egrep取出上面路径的目录名

echo /etc/rc.d/init.d/functions | egrep -o "^.*/"

5、统计last命令中以root登录的每个主机IP地址登录次数

last | egrep ^root.*[0-9.]{3}[0-9] | tr -s " " | cut -d" " -f 3 | sort -n | uniq -c

6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

for i in {0..255};do echo $i >> 0-255.txt ;done
egrep "\<[0-9]\>" 0-255.txt
egrep "\<[1-9][0-9]\>" 0-255.txt
egrep "\<[1][0-9][0-9]\>" 0-255.txt
egrep "\<[2][0-4][0-9]\>" 0-255.txt
egrep "\<[2][5][0-5]\>" 0-255.txt

7、显示ifconfig命令结果中所有IPv4地址

ifconfig | egrep -o "\<[0-9]+\>.\<[0-9]+\>.\<[0-9]+\>.\<[0-9]+\>"

8、将此字符串:welcome to linux 中的每个字符去重并排序,重复次数多的排到前面

echo welcome to linux | egrep -o [a-z] | sort | uniq -c | sort -nr

你可能感兴趣的:(linux学习,正则表达式,linux,centos,运维)