定义
正则表达式是用户所定义的模式模板(pattern template),linux工具可以用它来过滤文本。并且能够在处理数据试使用正则表达式对数据进行模式匹配。如下图:数据流匹配过程
- linux中常用正则表达式类型
- POSIX基本正则表达式(basic regular expression)引擎
- POSIX扩展正则表达式(extended regular expression)引擎
大多数linux工具都至少符合POSIX BRE引擎规范,能够识别该规范定义的所有模式符号。POSIX BRE引擎通常出现在依赖正则表达式进行文本过滤的编辑中。
基本正则表达式
字符匹配
字符 | 含义 |
---|---|
. | 匹配任意单个字符 |
[] | 匹配指定范围内的任意单个字符 |
[^] | 匹配指定范围外的任意单个字符 |
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任意小写字符 |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:blank:] | 空白字符(空格和制表符) |
[:space:] | 水平和垂直的空白字符 (比[:blank:]包含的范围广) |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃……) |
[:digit:] | 十进制数 |
[:xdigit:] | 十六进制数 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
匹配次数
匹配次数:用于要指定次数字符的后面,指定前面的字符要出现的次数
符号 | 含义 |
---|---|
* | 匹配前面的字符任意次,包括0次 |
? | 匹配前面的字符0或1次 |
+ | 匹配前面的字符至少1次 |
{n} | 匹配前面的字符n次 |
{n,m} | 匹配前面的字符至少n次,至多m次 |
{,n} | 匹配前面的字符至多n次 |
{n,} | 匹配前面的字符至少n次 |
位置锚定
指定字符出现的位置
符号 | 含义 |
---|---|
^ | 行首锚定,用于模式的最左侧 |
$ | 行尾锚定,用于模式的最右侧 |
\<或\b | 词首锚定,用于单词模式的最左侧 |
\>或\b | 词尾锚定,用于单词模式的最右侧 |
分组
分组:()将一个或多个字符捆绑在一起,当作一个整体处理,如;(root)+。分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量命名的方式为:\1,\2,\3……,\1表示从左侧起第一个括号以及与之匹配右括号之间的模式所匹配到的字符。
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
示例1
\(str1\(str2\)\)
\1:str1\(str2\)
\2:str2
示例2 \|或
a\|b a或b
H\|han H或han
\(H\|h\)an Han或han
常用组合
字符 | 含义 |
---|---|
.* | 任意长度的任意字符 |
^$ | 空行 |
^[[:space:]]*$ | 空白行 |
^# | 文件中的注释行 |
[0-9] | 数字0-9 |
扩展正则表达式
扩展正则表达式使用需要工具支持,书写更简洁,大多数不需要添加“\”。
字符 | 含义 |
---|---|
. | 任意单个字符 |
[] | 指定范围的字符 |
[^] | 排除指定范围的字符 |
* | 匹配前面字符任意次 |
? | 匹配前面字符0或1次 |
{m} | 匹配前面字符m次 |
<,\b | 词首 |
>,\b | 词尾 |
() | 分组 |
(H|h)an | 或者,Han或han |
最佳实践
位置锚定
[root@k8s-master ~]# cat test
name
hostname
[root@k8s-master ~]# egrep "\<name\>" test
name
[root@k8s-master ~]#
字符重复次数
以下方式只能过滤出,包含x:9且为后面包含两位数字的结果
[root@console ~]# cat /etc/passwd |egrep "x:9[[0-9]]?[[0-9]]?"
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
saslauth:x:995:76:Saslauthd user:/run/saslauthd:/sbin/nologin
setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin
chrony:x:993:988::/var/lib/chrony:/sbin/nologin
unbound:x:992:987:Unbound DNS resolver:/etc/unbound:/sbin/nologin
geoclue:x:991:985:User for geoclue:/var/lib/geoclue:/sbin/nologin
gluster:x:990:984:GlusterFS daemons:/run/gluster:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
[root@console ~]#
以下方式可以过滤出,包含x:1后面为0或1或2或两位数字的结果
[root@console ~]# cat /etc/passwd |egrep "x:1[[:digit:]{,2}*"
bin:x:1:1:bin:/bin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
[root@console ~]#