3 正则表达式¶
awk是支持正则表达式的。
3.1 如何使用正则表达式¶
[root@centos74 test]$ awk ' $1 ~ /li/ {print $2}' mail-list
555-5553
555-6699
这个例子就是使用了正则表达式,使用”/li/”去匹配第一个字段中包含了”li”的,然后打印出来第二个字段。
3.3 正则表达式元字符¶
\ 用于转义的
^ 用于锚定行首
$ 用于锚定行尾
. 用于单个任意字符
[...] 用于匹配集合单个字符
[^...] 用于匹配除了几何以外的字符
| 用于配合左侧,或者右侧
() 改变优先级的,作为一个整体
* 前面的分组或者字符任意次数。长配合.使用
+ 用于匹配前面的分组或者字符至少一次
? 用于匹配前面的分组或者字符一次或者0次。
{n} 用于匹配n次
{n,} 用于匹配至少n次
{m,n} 用于匹配m次到n次
3.4 一些中括号表达式¶
[:alnum:] 字母数字
[:alpha:] 字母
[:blank:] 空格和tab
[:cntrl:] 控制字符
[:digit:] 数字
[:lower:] 小写
[:upper:] 大写
3.5 匹配文本¶
使用正则去匹配文本
[root@centos74 test]$ echo "aaaabcd" |awk '{sub(/a+/,"<A>"); print $0}'
<A>bcd
这个使用到了awk内置的一个函数sub行数,第一个参数是正则,第个是替换的结果。
3.6 使用动态的正则表达式¶
动态的正则表达式就是把使用的正则表达式存起来。用的使用启用即可
[root@centos74 test]$ echo "aaaabcd" |awk 'BEGIN {test_re="a+"} $0 ~ test_re {print $0}'
aaaabcd
3.7 大小写敏感匹配¶
正则表达式是对大小写敏感的。如果不想对敏感,可以考虑使用函数转成小写在比较,或者指定忽略大小写。
[root@centos74 test]$ echo "Abc" |awk ' $0 ~ "ab" {print $0}'
[root@centos74 test]$ echo "Abc" |awk ' $0 ~ "Ab" {print $0}'
Abc
[root@centos74 test]$ echo "Abc" |awk ' tolower($0) ~ "ab" {print $0}'
Abc
[root@centos74 test]$ echo "Abc" |awk 'BEGIN{IGNORECASE =1 } $0 ~ "ab" {print $0}'
Abc