正则表达式在每种编程或者脚本语言中都会有,功能就是在你做不到精确匹配时,尽可能的匹配到符合预期的字符串,可以简化脚本语言逻辑和流程。比如做监控脚本时,要取内存值,磁盘使用率,cpu负载等。

正则表达式其实就是通过给定的符号生成一个字符串匹配的公式,通过公式把需要的数据匹配出来。

支持正则表达式的命令:locatefindvimgrepsedawk

正则表达式的分类

Shell 的正则表达式分为两种:
基本的正则表达式 (Basic Regular Expression 又叫Basic RegEx 简称BREs)
扩展的正则表达式 (Extended Regular Expression 又叫Extended RegEx 简称EREs)

基本正则 扩展正则
grep grep -E
sed sed -r
egrep egrep
awk awk

定位符

用于定位以什么开头,或者以什么结尾的符号

定位符 描述 基本正则 扩展正则
^ 定位以什么开头 支持 支持
$ 定位以什么结尾 支持 支持

示例:本文中所有示例都以 grep 为例

$ cat > test.txt << EOF
FeiYi's Blog
Mupei's Blog
FY
EOF

# 匹配以F开头的行
$ grep ^F test.txt
FeiYi's Blog
FY
# 匹配以g结尾的行
$ grep g$ test.txt 
FeiYi's Blog
Mupei's Blog
# 匹配以F开头,以Y结尾的行
$ grep ^FY$ test.txt
FY

匹配符

用来匹配模糊字符串

匹配符 描述 基本正则 扩展正则
. 匹配除回车以外的任意单个字符 支持 支持
( ) 字符串分组 不支持 支持
[ ] 匹配符号内任意单个字符 支持 支持
[ - ] 匹配给定范围内其中单个字符,[0-9][a-z][A-Z] 支持 支持
[^ ] 不匹配符号内字符 支持 支持
\ 转义字符,输出特殊字符 支持 支持
| 或者的意思,搭配( )使用,与[ ]作用一样 不支持 支持

示例

$ cat > test.txt << EOF
Fei
FeiYi
Mupei
Meiyou
This is example.
123
EOF

# 匹配以F开头,中间一个字符,以i结尾的行
$ grep ^F.i$ test.txt 
Fei
# 匹配以Mu开头
$ grep -E "^(Mu)" test.txt
Mupei
# 匹配以F或者M开头的行
$ grep -E "^(F|M)" test.txt 
$ grep "^[FM]" test.txt 
Fei
FeiYi
Mupei
Meiyou
# 匹配以M开头,但不匹配第二个字母为e的行
$ grep ^M[^e] test.txt
Mupei
# 匹配以.结尾的行
$ grep -E "(\.)$" test.txt
This is example.
# 匹配以任意数字开头的行
$ grep ^[0-9] test.txt 
123

限定符

对符号前面的字符或者字符串出现的次数作限定

匹配符 描述 基本正则 扩展正则
* 字符之后加*,表示该字符不出现或连续出现多次 支持 支持
? 与*类似,字符之后加?,表示该字符不出现或出现一次 不支持 支持
+ 与*类似,表示该字符出现一次或连续出现多次,至少一次 不支持 支持
{n} n为整数,字符之后加{n},某个字符出现n次 不支持 支持
{n,} n为整数,字符之后加{n,},某个字符出现n次或n次以上 不支持 支持
{n,m} n和m为整数,字符之后加{n,m},某个字符出现至少n次,最多m次 不支持 支持

示例

$ cat > test.txt << EOF
ac
abc
abbbc
abbbbc
abbbbbc
abbbbbbc
EOF

# 匹配ac之间没b和有多个b的行
$ grep "ab*c" test.txt
ac
abc
abbbc
abbbbc
abbbbbc
abbbbbbc

# 匹配ac之间没b或者只有1个b的行
$ egrep "ab?c" test.txt
ac
abc

# 匹配ac之间有b的行
$ egrep ab+c test.txt 
abc
abbbc
abbbbc
abbbbbc
abbbbbbc

# 匹配ac之间有3个b的行
$ egrep ab{3}c test.txt 
abbbc

# 匹配ac之间有3个b以上的行
$ egrep "ab{3,}c" test.txt 
abbbc
abbbbc
abbbbbc
abbbbbbc

# 匹配ac之间有2-5个b的行
$ egrep "ab{2,5}c" test.txt 
abbbc
abbbbc
abbbbbc

POSIX字符

posix 字符一次只匹配一个范围中的一个字节,基本和扩展表达式都支持

POSIX字符 说明
[:alnum:] 匹配任意数字和字母字符,等效[0-9a-zA-Z]
[:alpha:] 匹配任意单个大小写字母,等效[a-zA-Z]
[:lower:] 匹配任意单个小写字母,等效[a-z]
[:upper:] 匹配任意单个大写字母,等效[A-Z]
[:digit:] 匹配任意单个数字,等效[0-9]
[:space:] 匹配任意单个空白字符(制表符/新行/回车/换页符/垂直制表符),等效[\t\n\r\f\v],等效[\s]
[:graph:] 匹配任意单个非空白字符,等效[\S],等效[^\t\n\r\f\v]
[:blank:] 匹配空格和制表符其中一个
[:cntrl:] 控制字符,等于键盘上的control
[:print:] 非空字符(包括空格)
[:punct:] 标点符号字符
[:xdigit:] 匹配十六进制字符,等效[0-9a-fA-F]

注意:使用格式为:[[:alnum]],外围的括号是匹配符,里面的才是[:alnum:]。

这里就不再进行举例了,POSIX字符格式如下:

grep "[[:alnum:]]" test.txt

无论使用哪种方法,哪种字符,可以达到自己想要匹配的字符即可,灵活使用

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0