目录

一、正则表达式

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

1) ^ "行首定位符"

2)$ "行尾定位符"

3) . "匹配单个字符"

4) * “ 匹配前导符0到多次”

5) .* “ 匹配任意多个字符”

6)[ ] “匹配方括号中任意一个字符”

7) [ - ] “匹配指定范围内的一个字符”

8) [^] “匹配不在指定组里的字符”

 9)\ “用来转义元字符”

 10)\<  “词首定位符”

11) \> “ 词尾定位符”

 12) \(\) “vim匹配后的标签”

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

1)= “等于” 

2)!= “不等于” 

3)=~ “匹配” 

4) + “匹配一个或多个前导字符” 

5) ? “匹配零个或一个前导字符”

6)a|b “匹配a或b” 

7) () “组字符” 

8)x{m} “ 大括号前的字符x重复m次” 

9) x{,m} “ 大括号前的字符x最多出现m次”

10) x{m,} “大括号前的字符x重复至少m次”

四、扩展 

1)“\s” 匹配任何空白字符,包括空格、制表符、换行符等

2) “\d” 匹配数字 


一、正则表达式

正则表达式(Regular Expression, RE)是一种字符模式, 用于处理文本,在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜杠之间;

例如/[Aa]bc+/就是由正斜杠界定的正则表达式, 它将匹配被查找的行中任何位置出现的相同模式. 在正则表达式中,元字符是最重要的概念;

元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

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

基本元字符功能
^行首定位符(包括空格)
$行尾定位符(包括空格)
.匹配单个字符(包括空格、符号)
* 匹配前导符0到多次(匹配的是*号前的第一个字符0到多次,包括空格,其他位置固定) 
.*匹配任意多个字符  (贪婪匹配)
[ ]匹配方括号中任意一个字符
[ - ]匹配指定范围内的一个字符(不包括空格)
[^]匹配不在指定组里的字符
\用来转义元字符
\<词首定位符 (包括空格)
\>词尾定位符(包括空格)
\(\)vim编辑器中匹配的标签

正则表达式可以被多种工具使用。例如grep\sed\awk\test等,以下使用grep命令为例 :

1) ^ "行首定位符"

[root@master srv]# cat -n test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3   ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
     4  nobody:x:99:99:Nobody:/:/sbin/nologin /abc
     5  root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
     6  nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop
     7  mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
     8  god:x:1001:1001::/home/god:/bin/bash.back
     9  mailnull:x:47:47::/var/spool/mqueue:/sbin/no@login
    10  smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
    11  apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    12  张三 李四 王五
[root@master srv]# grep -n "^b" test.txt   #-n 输出的同时打印行号
2:bin:x:1:1:bin:/bin:/sbin/nologin
[root@master srv]# grep -n "^ " test.txt
3: ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

2)$ "行尾定位符"

[root@master srv]# grep -n "\.back$" test.txt  #'.'是一种元字符,所以需转义
8:god:x:1001:1001::/home/god:/bin/bash.back

3) . "匹配单个字符"

[root@master srv]# grep -n "r..t" test.txt
1:root:x:0:0:root:/root:/bin/bash
3: ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
5:root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
[root@master srv]# grep -n "no.login" test.txt
9:mailnull:x:47:47::/var/spool/mqueue:/sbin/no@login
[root@master srv]# grep -n "in..abc" test.txt
4:nobody:x:99:99:Nobody:/:/sbin/nologin /abc 

4) * “ 匹配前导符0到多次”

#匹配的是*号前的第一个字符0到多次,包括空格,其他位置固定

[root@master srv]# grep " /*" test.txt 
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin /abc 
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
张三 李四 王五
[root@master srv]# grep "loo*" test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin /abc 
nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop
mailnull:x:47:47::/var/spool/mqueue:/sbin/no@login
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

 #全部匹配 grep "o*" /etc/passwd    //字母"o"可以是任意字符

[root@master srv]# grep "o*" test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin /abc 
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
god:x:1001:1001::/home/god:/bin/bash.back
mailnull:x:47:47::/var/spool/mqueue:/sbin/no@login
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
张三 李四 王五

5) .* “ 匹配任意多个字符”

#(贪婪匹配)

[root@master srv]# grep ".*" test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin /abc 
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
god:x:1001:1001::/home/god:/bin/bash.back
mailnull:x:47:47::/var/spool/mqueue:/sbin/no@login
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
张三 李四 王五

6)[ ] “匹配方括号中任意一个字符”

[root@master srv]# grep "[tk]" test.txt 
root:x:0:0:root:/root:/bin/bash
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
god:x:1001:1001::/home/god:/bin/bash.back
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

7) [ - ] “匹配指定范围内的一个字符”

[root@master srv]# grep "[c-e]k" test.txt 
god:x:1001:1001::/home/god:/bin/bash.back

8) [^] “匹配不在指定组里的字符”

[root@master srv]# grep "[o-q]p" test.txt 
nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop
[root@master srv]# grep "[^o-q]p" test.txt 
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/no@login
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

 9)\ “用来转义元字符”

[root@master srv]# grep "\." test.txt 
god:x:1001:1001::/home/god:/bin/bash.back

 10)\<  “词首定位符”

[root@master srv]# grep "\<root 0" test.txt 
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash

11) \> “ 词尾定位符”

[root@master srv]# grep "abc\>" test.txt 
nobody:x:99:99:Nobody:/:/sbin/nologin /abc

 12) \(\) “vim匹配后的标签”

[root@master srv]# cat mail 
张三 李四 王五
[root@master srv]# vim mail
王五 张三 李四

:%s@\(张三\) \(李四\) \(王五\)@ \3 \1 \2@g

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

扩展元字符功能
=等于
!=不等于
=~匹配
+匹配一个或多个前导字符1次或多次(不包括空格)
匹配零个或一个前导字符
a|b匹配a或b(grep命令中要用引号" | ”引起来)
()组字符
(..)(..)\1\2标签匹配字符
x{m} 大括号前的字符x重复m次(相邻的字符,需要用“ ”引起来)
x{,m} 大括号前的字符x最多出现m次
x{m,} 大括号前的字符x重复至少m次
x{m,n} 大括号前的字符x重复m到n次

 #使用test命令演示“=、!=、=~”功能 

1)= “等于” 

[root@master srv]# cat test2.sh 
#!/bin/bash              #shebang,定义解释器,shell脚本格式
a=`echo $[ 3+2 ]`        #$[]:进行四则运算。整行意义是将算数的结果赋值给变量a
if [[ $a = 5 ]];then     #条件判断
    printf "%s" "3+2=5"  #printf命令
    echo                 #空行,使格式美观
fi

[root@master srv]# sh test2.sh 
3+2=5

2)!= “不等于” 

[root@master srv]# cat test2.sh 
#!/bin/bash              #shebang,定义解释器,shell脚本格式
a=`echo $[ 3+2 ]`        #$[]:进行四则运算。整行意义是将算数的结果赋值给变量a
if [[ $a != 6 ]];then    #条件判断
    printf "%s" "3+2=6"  #printf命令
    echo                 #空行,使格式美观
fi

[root@master srv]# sh test2.sh 
3+2=6

3)=~ “匹配” 

输入的是ok[root@master srv]# cat test2.sh 
#!/bin/bash                       #shebang,定义解释器,shell脚本格式
read -p "请输入ok:" input        
if [[ $input =~ ok ]];then        #条件判断是否匹配
    printf "%s" "输入的是ok" 
    echo                          #空行
else
    printf "%s" "输入的不是ok"
    echo                          #空行
fi

[root@master srv]# sh test2.sh 
请输入ok:ok
输入的是ok
[root@master srv]# sh test2.sh 
请输入ok:cc
输入的不是ok

4) + “匹配一个或多个前导字符” 

egrep=grep -E  

-E, --extended-regexp     PATTERN 是一个可扩展的正则表达式(缩写为 ERE)

[root@master srv]# egrep "[a-o]+p" test.txt  
nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

5) ? “匹配零个或一个前导字符”

"r.*t"                               贪婪匹配(匹配以“r”开头,以”t“结尾的内容)
-P  "r.*?"                        非贪婪匹配(匹配“r”字母)

-P, --perl-regexp            PATTERN 是一个 Perl 正则表达式

[root@master srv]# egrep "a?sh" test.txt 
root:x:0:0:root:/root:/bin/bash
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
god:x:1001:1001::/home/god:/bin/bash.back
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

6)a|b “匹配a或b” 

[root@master srv]# egrep "0:|27" test.txt 
root:x:0:0:root:/root:/bin/bash
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false

7) () “组字符” 

#两个oo出现一次或者多个(将”oo“看成一个整体前导符,grep命令中要用” “引起来)

[root@master srv]# egrep "(oo)+p" test.txt 
nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop
[root@master srv]# egrep "(r|l)oo" test.txt 
root:x:0:0:root:/root:/bin/bash
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop

8)

x{m} “ 大括号前的字符x重复m次” 

[root@master srv]# egrep "0{2}" test.txt 
root0:x:1000:1000:centos7_2009:/home/root 0:/bin/bash
god:x:1001:1001::/home/god:/bin/bash.back

括号前也可以是元字符组合

[0-9a-fA-F]{8}

9) x{,m} “ 大括号前的字符x最多出现m次”

[root@master srv]# egrep "51{,1}" test.txt 
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

10) x{m,} “大括号前的字符x重复至少m次”

[root@master srv]# egrep "lo{2,5}" test.txt 
nginx:x:987:981::/home/nginx:/sbin/nologin/loop/looop/looooop

四、扩展 

1)“\s” 匹配任何空白字符,包括空格、制表符、换行符等

root@master srv]# cat case
aa bb cc
123

[root@master srv]# grep -P "\s"  case 
aa bb cc

2) “\d” 匹配数字 

[root@master srv]# grep -P "\d"  case 
123
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐