正则表达式使用
正则表达式
正则表达式分两类:
基本正则表达式
扩展正则表达式
帮助:man 7 regex
基本正则表达式元字符
字符匹配
字符 | 说明 |
---|---|
. | 匹配任意单个字符,可以是一个汉字 |
[] | 匹配指定范围内的任意单个字符,示例:[long] |
[^] | 匹配指定范围外的任意单个字符,示例:[^long] |
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字符,即:A-Z,a-z |
[:upper:] | 大写字母 |
[:blank:] | 空白字符(空格和制表符) |
[:space:] | 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广 |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃...) |
[:digit:] | 十进制数字 |
[:xdigit:] | 十六进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
范例
[15:41:25 root@sz-kx-centos8 /home]# ls /etc/ | grep 'rc[.0-6]'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[15:41:48 root@sz-kx-centos8 /home]# ls /etc/ | grep 'rc[.0-6].'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[15:42:25 root@sz-kx-centos8 /home]# ls /etc/ | grep 'rc[.0-6]\.'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
匹配次数
符号 | 说明 |
---|
- | 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* | 任意长度的任意字符
\?
| 匹配其前面的字符出现0次或1次,即:可有可无
\+
| 匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\}
| 匹配前面的字符n次
\{m,n\}
| 匹配前面的字符至少m次,至多n次
\{,n\}
| 匹配前面的字符至多n次,<=n
\{n,\}
| 匹配前面的字符至少n次
范例
[15:42:43 root@sz-kx-centos8 /home]# echo /etc/ | grep '/etc/\?'
/etc/
[15:46:48 root@sz-kx-centos8 /home]# echo /etc | grep "/etc/\?"
/etc
范例
[03:48:09 root@sz-centos7 /home]# cat test.txt
gooogle
goooooooooooooooooooooooooogle
ggle
gogle
gooooooooo000000000000gle
gooogle
google
[03:48:36 root@sz-centos7 /home]# grep 'go\{2,\}gle' test.txt
gooogle
goooooooooooooooooooooooooogle
gooogle
google
[03:49:07 root@sz-centos7 /home]# grep 'goo\+gle' test.txt
gooogle
goooooooooooooooooooooooooogle
gooogle
google
[03:49:37 root@sz-centos7 /home]# grep 'goo*gle' test.txt
gooogle
goooooooooooooooooooooooooogle
gogle
gooogle
google
[03:49:56 root@sz-centos7 /home]# grep 'gooo*gle' test.txt
gooogle
goooooooooooooooooooooooooogle
gooogle
google
范例
[04:06:58 root@sz-centos7 /home]# echo -1 -2 123 -123 233 | grep '-\?[0-9]\+'
grep: invalid option -- '\'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
[04:27:05 root@sz-centos7 /home]# echo -1 -2 123 -123 233 | grep '\-\?[0-9]\+'
-1 -2 123 -123 233
[04:27:22 root@sz-centos7 /home]# echo -1 -2 123 -123 233 | grep -E '-?[0-9]+'
grep: invalid option -- '?'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
[04:27:59 root@sz-centos7 /home]# echo -1 -2 123 -123 233 | grep -E '-\?[0-9]+'
grep: invalid option -- '\'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
[04:28:09 root@sz-centos7 /home]# echo -1 -2 123 -123 233 | grep -E '\-?[0-9]+'
-1 -2 123 -123 233
[04:28:38 root@sz-centos7 /home]# echo -1 -2 123 -123 233 | grep -E -- '\-?[0-9]+'
-1 -2 123 -123 233
[04:29:12 root@sz-centos7 /home]# echo -1 -2 123 -123 233 | grep -E '(-)?[0-9]+'
-1 -2 123 -123 233
范例:获取IP地址
[04:32:10 root@sz-centos7 /home]# ifconfig eth0 | grep netmask | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -n1
172.31.0.17
[04:34:22 root@sz-centos7 /home]# ifconfig eth0 | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -n1
172.31.0.17
位置锚定
符号 | 说明 |
---|---|
^ | 行首锚定, 用于模式的最左侧 |
$ | 行尾锚定,用于模式的最右侧 |
^PATTERN$ | 用于模式匹配整行 |
^$ | 空行 |
^[[:space:]]*$ |
空白行 |
\< 或 \b |
词首锚定,用于单词模式的左侧 |
\> 或 \b |
词尾锚定,用于单词模式的右侧 |
<PATTERN> | 匹配整个单词 |
\w | 匹配单词构成部分,等价于[_[:alnum:]] |
\W | 匹配非单词构成部分,等价于[^_[:alnum:]] |
注意: 单词是由字母,数字,下划线组成
范例
[04:36:30 root@sz-centos7 /home]# grep '^[^#]' /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=8fb7a3be-5e81-4f5d-ab35-afb996f29c9c /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
范例
[04:40:24 root@sz-centos7 /home]# grep -v '^$' /etc/profile | grep -v '^#'
[04:41:13 root@sz-centos7 /home]# grep '^[^$#]' /etc/profile
分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例
\(string1\(string2\)\)
\1 :string1\(string2\)
\2 :string2
注意: 后向引用引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:\|
示例
a\|b #a或b
C\|cat #C或cat
\(C\|c\)at #Cat或cat
范例:排除空行和#开头的行
[04:47:19 root@sz-centos7 /home]# grep -v '^#' /etc/httpd/conf/httpd.conf | grep -v '^$'
[04:47:19 root@sz-centos7 /home]# grep -v '^#\|^$' /etc/httpd/conf/httpd.conf
[04:48:20 root@sz-centos7 /home]# grep -v '^\(#\|$\)' /etc/httpd/conf/httpd.conf
[04:49:18 root@sz-centos7 /home]# grep '^[^#]' /etc/httpd/conf/httpd.conf
扩展正则表达式元字符
字符 | 说明 |
---|---|
. | 任意单个字符 |
[wang] | 指定范围的字符 |
[^wang] | 不在指定范围的字符 |
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字符,亦即 A-Z, a-z |
[:lower:] | 小写字母,示例:[[:lower:]],相当于[a-z] |
[:upper:] | 大写字母 |
[:blank:] | 空白字符(空格和制表符) |
[:space:] | 水平和垂直的空白字符(比[:blank:]包含的范围广) |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃...) |
[:digit:] | 十进制数字 |
[:xdigit:] | 十六进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
次数匹配
字符 | 说明 |
---|
- | 匹配前面字符任意次
? | 0或1次
- | 1次或多次
{n} | 匹配n次
{m,n} | 至少m,至多n次
位置锚定
字符 | 说明 |
---|---|
^ | 行首 |
$ | 行尾 |
\<, \b |
语首 |
\>, \b |
语尾 |
分组其它
字符 | 说明 |
---|---|
() | 分组 |
后向引用: | \1, \2, ... |
` | ` |
`a | b` |
`C | cat` |
`(C | c)at` |
范例:
[04:58:45 root@sz-centos7 /home]# ifconfig | grep -Ewo "(([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])"|head -n1
172.31.0.17