awk一个神奇而又强大的功能,绝对是一个开发利器,效率直选!希望这里的一些总结能帮到那些存在困惑的人!
1 awk匹配模式
在awk介绍第一节提到,awk是由匹配模式和动作组成:
pattern { action }
#### 1-BEGIN和END两张特殊类型模式,没有针对输入进行测试 BEGIN END #### 2 BEGINFILE和ENDFILE是附加的特殊模式,它们的主体在读取每个命令行输入文件的第一条记录之前以及在读取每个文件的最后一条记录之后执行。 在BEGINFILE规则内,如果文件成功打开,ERRNO的值将为空字符串。 否则,文件存在一些问题,代码应使用nextfile跳过它。 如果没有这样做,gawk会对无法打开的文件产生通常的致命错误。 BEGINFILE ENDFILE #### 3 正则表达式模式在输入记录与正则表达式匹配时候执行关联语句,其表达形式与egrep语句相同 /regular expression/ relational expression #### 4 &&逻辑与,||逻辑或 !逻辑非 ?:与c一样三目运算 pattern && pattern pattern || pattern pattern ? pattern : pattern (pattern) ! pattern #### 5 范围模式:它匹配与pattern1匹配的的所有输入记录,指导匹配patteran2的记录 pattern1, pattern2
大部分情况下都是按照这一个思路在编写awk的代码,写出这样的代码:
cat test | awk 'BEGIN {print "SUM:"} {print $1} END {print "END SUM!!!"}'
但是实际上除了BEGIN和END外很少使用匹配多个条件,实际上awk的语法应该是这样的:
awk ‘pattern{action}pattern{action}…’ file
这里的理解是:如果条件1满足执行动作1并退出,否则执行下一个条件判断,依次类推!!!
也就是说每一个模式都是一个独立条件判断,类似于if (...){...}else if(...){...} else if(....){...}else {}
模式匹配满足一个条件条件执行完后就马上开启下一个!
2 匹配表达式
字符 | 说明 |
---|---|
c | 匹配字符c |
\c | 匹配文字字符c |
* | 匹配任何一个字符 |
$ | 匹配字符串尾部 |
[abc…] | 匹配由abc组成的任何字符 |
[^abc…] | 匹配不是由abc组成的任何字符 |
r1|r2 | 任意匹配r1或者r2 |
r1r2 | 先匹配r1再匹配r2 |
r+ | 匹配一到多次r |
r* | 匹配0到多次r |
r? | 匹配0到1一次r |
® | 匹配组r |
r{n} | 匹配n次r |
r{n,} | 匹配大于n次r |
r{n,m} | 匹配n-m次r |
\y | 匹配空字符串无论是在开头还是结尾 |
\B | 匹配单词中的空字符串 |
\< | 匹配单词开头的空字符串 |
\> | 匹配单词结尾的空字符串 |
\s | 匹配任何空白字符 |
\S | 匹配任何非空白字符 |
\w | 匹配任何单词字符 |
匹配任何非单词字符 |
|
\` | 匹配buffer开头空字符串 |
\’ | 匹配buffer结尾空字符串 |
2 模式匹配实例
如下所示有个一文档a.log:
hello 123 123
wang 100 bcd
zhng 180 abc
abc
使用表达式awk如下所示:
awk '$1~/wang/{$2=$2+300} NR==2 {print $0}' a.log
最后结果显示为:
user@user:~/$ awk '$1~/wang/{$2=$2+300} NR==2 {print $0}' a.log
wang 400 bcd
我们改变一下条件顺序:
user@user:~/$ awk 'NR==2 {print $0} $1~/wang/{$2=$2+300}' a.log
wang 100 bcd
可以发现虽然两个模式条件都能匹配第二行,但是实际上只要满足了第一个条件,该行的模式匹配就直接完成了!!!
3 awk模式匹配总结
awk的模式匹配就相当于我们平日代码的
if (...){...}else if(...){...} else if(....){...}else {}
,优先匹配完就会返回;
awk的条件和动作可以二者缺一,但是不能两者全部缺失
;
awk '$1~/wang/{$2=$2+300} 1' a.log
这个1就是当前面条件不满足时候默认为真的一个补充条件,而此时动作也是默认动作,也就是{print $0}
BEGIN和END就是两个特殊条件,他们不跳转行,但是第一次启动awk和最后一行完成后必然会进入BEGIN或者END;他们同样符合这个原则!