05-正则表达式
1 字符匹配
. 匹配任意单个字符(除了\n),可以是一个汉字或其它国家的文字
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
-----------------
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\r\t\v]。注意 Unicode 正
则表达式会匹配全角空格符
\S #匹配任何非空白字符。等价于 [^\f\r\t\v]
\w #匹配一个字母,数字,下划线,汉字,其它国家文字的字符,等价于[_[:alnum:]字]
\W #匹配一个非字母,数字,下划线,汉字,其它国家文字的字符,等价于[^_[:alnum:]字]
[root@rocky ~]# cat /etc/passwd |grep r..t ..两字符 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin clevis:x:995:989:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin
[root@rocky ~]# echo "a" |grep '[chuan]' 范围内 a [root@rocky ~]# echo "w" |grep '[chuan]'
[root@rocky ~]# echo "c" |grep '[^chuan]' 范围外 [root@rocky ~]# echo "h" |grep '[^chuan]' [root@rocky ~]# echo "u" |grep '[^chuan]' [root@rocky ~]# echo "a" |grep '[^chuan]' [root@rocky ~]# echo "n" |grep '[^chuan]' [root@rocky ~]# echo "w" |grep '[^chuan]' w
touch f{a..z}.txt
touch f{A..Z}.txt
[root@rocky data]# ls f[[:lower:]].txt 小写
[root@rocky data]# ls f[[:upper:]].txt 大写
[root@rocky data]# ls | grep "f[[:upper:]].txt"
[root@rocky data]# ls f[a-z].txt 通配符含大写
fa.txt fB.txt
2,匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配 .* #任意长度的任意字符 \? #匹配其前面的字符出现0次或1次,即:可有可无 \+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次 \{n\} #匹配前面的字符n次 \{m,n\} #匹配前面的字符至少m次,至多n次 \{,n\} #匹配前面的字符至多n次,<=n \{n,\} #匹配前面的字符至少n次
[root@rocky data]# echo rt | grep ro*t
rt
[root@rocky data]# echo roooooooooooooooooooot | grep ro*t
roooooooooooooooooooot
[root@rocky data]# grep ".*t" /etc/passwd root:x:0:0:root:/root:/bin/bash
[root@rocky data]# ls |grep "f.*".txt
\? 0次或N次
[root@rocky data]# echo xa |grep "xa\?" xa [root@rocky data]# echo x |grep "xa\?" x
[root@rocky data]# echo xxaa |grep "xa\?" #a可有可无 xxa
\+ 一次以上满足,至少一次
[root@rocky data]# echo gogle |grep "go\+gle" gogle
\{\n} 必须5次才满足
[root@rocky data]# echo gooooogle |grep "go\{5\}gle" gooooogle [root@rocky data]# echo gooooogle |grep "go\{4\}gle" [root@rocky data]#
5次一下
[root@rocky data]# echo ggle |grep "go\{,5\}gle" ggle
0-9 一到三次 \. 不是正则表达式的.
[root@rocky data]# ifconfig ens33 | grep netmask |grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 192.168.80.171 255.255.255.0 192.168.80.255
[root@rocky data]# ifconfig ens33 | grep netmask |grep -o -m1 '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' |head -n1 192.168.80.171
[root@rocky data]# echo 999.999.999.999 |grep -o -m1 '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 999.999.999.999
[root@rocky data]# echo 1999.999.999.99911 |grep -o -m1 '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 999.999.999.999
位置锚定
位置锚定可以用于定位出现的位置
^ #行首锚定, 用于模式的最左侧 $ #行尾锚定,用于模式的最右侧 ^PATTERN$ #用于模式匹配整行 ^$ #空行 ^[[:space:]]*$ #空白行 \< 或 \b #词首锚定,用于单词模式的左侧 \> 或 \b #词尾锚定,用于单词模式的右侧 \<PATTERN\> #匹配整个单词 #注意: 单词是由字母,数字,下划线组成
位置
IP地址 正则表示
^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
[0-9] 表示数字0至9之间的任意一个数字 ?表示0次或一次 | 或 ()整体 \. 无特殊含义 ()整体 {3} 三次 ^$ 位置锚定
[root@rocky data]# IP=0.0.0.0 [root@rocky data]# [[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] ;echo $? 0 [root@rocky data]# IP=0.0.0.888 [root@rocky data]# [[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] ;echo $? 1
[root@rocky data]# echo 999.999.999.999 |grep -o -m1 '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$' 999.999.999.999 [root@rocky data]# echo 0.0.0.0 |grep -o -m1 '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$' 0.0.0.0
[root@rocky data]# echo gexuchuan |grep "\<gexuchua\>" [root@rocky data]# [root@rocky data]# echo gexuchuan |grep "\<gexuchuan\>" gexuchuan
() 分组
后向引用:\1, \2, ... 注意: \0 表示正则表达式匹配的所有字符
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
[root@rocky data]# echo abcabcabc |grep "\(abc\)\{3\}" abcabcabc
[root@rocky data]# echo abc123xyzaaaabc |grep '\(abc\)\(123\)\(xyz\).*\1' abc123xyzaaaabc
[root@rocky data]# echo abc123xyzaaaabcxyz |grep '\(abc\)\(123\)\(xyz\).*\3' #后续引用 abc123xyzaaaabcxyz