awk是支持正则表达式的。
[root@centos74 test]$ awk ' $1 ~ /li/ {print $2}' mail-list
555-5553
555-6699
这个例子就是使用了正则表达式,使用"/li/"去匹配第一个字段中包含了"li"的,然后打印出来第二个字段。
下面这些是c语言的风格的控制符号, bash中的echo,printf都是差不多的。
\\ 字符“\”
\\a 响铃
\n 新行
\r 回车
\t 水平制表符TAB
\ 用于转义的
^ 用于锚定行首
$ 用于锚定行尾
. 用于单个任意字符
[...] 用于匹配集合单个字符
[^...] 用于匹配除了几何以外的字符
| 用于配合左侧,或者右侧
() 改变优先级的,作为一个整体
* 前面的分组或者字符任意次数。长配合.使用
+ 用于匹配前面的分组或者字符至少一次
? 用于匹配前面的分组或者字符一次或者0次。
{n} 用于匹配n次
{n,} 用于匹配至少n次
{m,n} 用于匹配m次到n次
[:alnum:] 字母数字
[:alpha:] 字母
[:blank:] 空格和tab
[:cntrl:] 控制字符
[:digit:] 数字
[:lower:] 小写
[:upper:] 大写
使用正则去匹配文本
[root@centos74 test]$ echo "aaaabcd" |awk '{sub(/a+/,"<A>"); print $0}'
<A>bcd
这个使用到了awk内置的一个函数sub行数,第一个参数是正则,第个是替换的结果。
动态的正则表达式就是把使用的正则表达式存起来。用的使用启用即可
[root@centos74 test]$ echo "aaaabcd" |awk 'BEGIN {test_re="a+"} $0 ~ test_re {print $0}'
aaaabcd
正则表达式是对大小写敏感的。如果不想对敏感,可以考虑使用函数转成小写在比较,或者指定忽略大小写。
[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
tolower是内置的函数,IGNORECASE是内置的变量。
3.8 更多关于正则表达式的。
正则表达式是在各个语言都有的。 基本都是满足posix标准的。 学习一个语言,再去学习其他的也是快速上手的。 详细的正则表达式可以参考wifi上的。