3 正则表达式

awk是支持正则表达式的。

3.1 如何使用正则表达式

[root@centos74 test]$ awk ' $1 ~ /li/ {print $2}' mail-list
555-5553
555-6699

这个例子就是使用了正则表达式,使用”/li/”去匹配第一个字段中包含了”li”的,然后打印出来第二个字段。

3.2 基础的转义符号

下面这些是c语言的风格的控制符号, bash中的echo,printf都是差不多的。

\\          字符“\”
\\a         响铃
\n          新行
\r          回车
\t          水平制表符TAB

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