1.1概念
在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成
正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等
1.2基本正则表达式
基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式诺法标准之一,另外一种语法标准称为扩展正则表达式
1.2.1常见元字符
bash
元字符 说明
^ 以某个字符开头
$ 以某个字符结尾
. 匹配任意单字符
* 对前一项进行0次或者多次重复
{m,n} 匹配将前一项字符重复m-n次,{m,},,n},{m,n}
[] 对方括号内的单字符进行匹配
[^] 不匹配方括号内的单字符
^[] 匹配以某个字符开头的行
() 定义一个子表达式
词首【\<或\b】【\>或\b】 其后面的任意字符必须作为单词首部出现;其前面的任意字符必须作单词和词尾锚定为尾部出现
\ 转义字符,让一些特殊符号失效
1.2.2POSIX字符类
POSIX字符类是一个形如[:...:]的特殊元序列(metasequence),他可以用于匹配特定的字符范国
1.2.3示例
[ab]:检索包含a或包含b的行信息,注意:[ ]只能表示一个对象
bash
# 检索包含d或者D行的信息
[root@server ~]# grep -n [dD] /etc/passwd
#检索字母包含o的行信息
[root@server ~]# grep -n [oo] /etc/passwd
[^] :检索不包含关键字的行信息(反向着色)
bash
# 检索不包含字母o的的行信息
[root@server ~]# grep -n [^o] /etc/passwd
# 检索不以r开头的前不包含oot的行信息
[root@server ~]# grep -n [^r]oot /etc/passwd
[-] : 检索范围如[0-9] [a-z] [A-Z] [a-zA-Z] [0-9a-zA-Z]
bash
# 检索包含7-9的数字行信息
[root@server ~]# grep -n [7-9] /etc/passwd
# 检索包含大写字母
[root@server ~]# grep -n [A-Z] /etc/passwd
#检索数字和字母的行信息
[root@server ~]# grep -n [[:alnum:]] /etc/passwd
[root@server ~]# grep -n [0-9a-zA-Z] /etc/passwd
^行首与$行尾
bash
# 检索root开头的行信息
[root@server ~]# grep -n ^root /etc/passwd
# 检索以#开头的信息
[root@server ~]# grep -n ^# /etc/sos/sos.conf
# 检索[开头的行信息
[root@server ~]# grep -n "^\[" /etc/sos/sos.conf
#检索数字结尾的行信息
[root@server ~]# grep -n [0-9]$ /etc/sos/sos.conf
6:#verbose = 3
9:#log-size = 15
[root@server ~]# grep -n "[0-9]$" /etc/sos/sos.conf
# 检索空白行
[root@server ~]# grep -n "^$" /etc/sos/sos.conf
# 注意
# 检索不包含r o t
[root@server ~]# grep -n [^root] /etc/passwd
# 检索以r o t 开头的行信息
[root@server ~]# grep -n ^[root] /etc/passwd
# 检索以root开头的行信息
[root@server ~]# grep -n ^root /etc/passwd
点(.)和(*)
bash
# 检索以r开头t结尾中间包含2个字母的行信息
[root@server ~]# grep -n r..t /etc/passwd
# 检索至少包含一个字母w的行信息
[root@server ~]# grep -n ww* /etc/passwd
# 检索至少包含俩个oo的行信息
[root@server ~]# grep -n ooo* /etc/passwd
# 检索以包含.的行信息
[root@server ~]# grep -n "\." /etc/passwd
1.3拓展正则表达式
1.3.1概念
扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字"["以及"[^]"这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。
bash
元字符 说明
? 将前一项字符进行0次或者1次的重复匹配
+ 将前一项进行1次或者多次的重复匹配
(|) 匹配(|)符号左边或者右边的字符
1.3.2示例
bash
# 显示文件以bash结尾的行信息
[root@server ~]# grep -n bash$ /etc/passwd
# 找出仅包含三位数或者四位数的行信息
[root@server ~]# grep -n "\<[0-9]\{3,4\}\>" /etc/passwd
[root@server ~]# grep -n "\<[[:digit:]]\{3,4\}\>" /etc/passwd
# 检索/etc/grub2.cfg文件中检索至少一个空白字符开头后跟非空字符的行
[root@server ~]# egrep -n "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
[root@server ~]# grep -n "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
[root@server ~]# grep -nE "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
#解释
# ^[[:space:]]:以空白字符开头
# 至少出现一次
# [^[:space:]]:不包含空白字符
# -E:支持启用扩展正则
bash
# 查看端口号
[root@server ~]# netstat -tan
#检索netstat -tan 显示信息中包含LISTEN后跟上0个或多个空白字符结尾方行信息
[root@server ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
# *$:重复前面内容0次或多次作为行结尾
#检索fdisk -l显示内容中包含以/dev开头后跟上n的相关信息
[root@server ~]# fdisk -l | grep ^/dev/n
# 检索/proc/meminfo文件中,所有以大写A或者大写S开头的行信息
[root@server ~]# grep -n ^[AS] /proc/meminfo
# 显示/etc/passwd 文件中root、sshd、chrony的相关信息
[root@server ~]# grep -nE "(root|sshd|chorny)" /etc/passwd
[root@server ~]# egrep -n "(root|sshd|chorny)" /etc/passwd
# 检索ifconfig命令显示结果中的1-255的整数共
[root@server ~]# ifconfig | grep -oE "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9])\>"
[root@server ~]# ifconfig | grep -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-9])\>"
# 检索1dd /usr/bin/cat 命令结果中的文件路径
[root@server ~]# ldd /usr/bin/cat | grep -Eo /[^[:space:]]+
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2