Linux 正则表达式的基础使用
正则表达式;基本正则元字符;扩展正则元字符;^;$;.;*;.*;[ ];[- ];[^];\;\;\(\);=;!=;=~;+;?;|;();x{m};x{,m};x{m,};x{n,m};\s;\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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)