正则表达式在每种编程或者脚本语言中都会有,功能就是在你做不到精确匹配时,尽可能的匹配到符合预期的字符串,可以简化脚本语言逻辑和流程。比如做监控脚本时,要取内存值,磁盘使用率,cpu负载等。
正则表达式其实就是通过给定的符号生成一个字符串匹配的公式,通过公式把需要的数据匹配出来。
支持正则表达式的命令:locate、find、vim、grep、sed、awk
正则表达式的分类
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
无论使用哪种方法,哪种字符,可以达到自己想要匹配的字符即可,灵活使用