原文:http://doc.lazyhack.net/awk.htm
Awk通过判断pattern的值来决定是否执行对应的actions,常见的pattern:
BEGIN是awk的保留字,一种特殊的pattern,BEGIN成立(值为true)的条件是:awk程序开始执行,尚未读取任何数据之前。所以BEGIN{actions}语法中actions部分只会在程序一开始被执行一次。当awk读入数据行后BEGIN就不再成立
例如:
BEGIN {
FS = "[ \t:]" # 于程序一开始时, 改变awk切割字段的方式
RS = "" # 于程序一开始时, 改变awk分隔数据行的方式
count = 100 # 设定变量 count 的起始值
print " This is a title line " # 印出一行 title
}
....... # 其它 Pattern { Actions } .....
END 为 awk 的保留字, 是另一种特殊的 Pattern.
END 成立(其值为true)的条件为:"awk 处理完所有数据, 即将离开程序时",平常读入数据行时, END并不成立, 故其对应的 Actions 并不被执行; 唯有当awk读完所有数据时, 该 Actions 才会被执行
注意 : 不管数据行有多少笔, 该 Actions 仅被执行一次.
例如:awk '{tot+=$3} END {print tot}' emp.dat,每读入一数据行将$3的值相加并赋值给tot,在数据处理结束即将推出awk的时候,END条件成立,执行对应的actions,输出tot的值到标注输出。
关系表达式当成pattern时,当关系成立则执行对应的actions
Awk中的关系运算符包含:
> 大于
< 小于
>= 大于或等于
<= 小于或等于
== 等于
!= 不等于
~ match
!~ not match
若 A 为一字符串, B 为一正则表达式.
A ~B 判断 字符串A 中是否 包含 能匹配(match)B式样的子字符串.
A !~B 判断 字符串A 中是否 未包含 能匹配(match)B式样的子字符串.
例如:
awk 'length($0) <= 16 { print $0 }' emp.dat打印数据行字符数小于等于16的行
awk '$1~"^A.*"{print $0}' emp.dat打印$1匹配以A开头的数据行
各种 Pattern的结果为一逻辑值(True or False).awk中逻辑值彼此间可通过&&(and), ||(or), !(not) 结合成一个新的逻辑值.故Patterns 彼此可通过上述结合符号来结合成一个新的 Pattern进行复杂的条件判断.
例 如 :
awk 'FNR>=2 && FNR<=4{print $0}' emp.dat通过&&将两个pattern结合成一个pattern,将打印文件中的2-4行数据,FNR表示读取文件正在处理的行数
遇到这种 Pattern, awk 会帮您设立一个 switch(或flag).
当awk读入的数据行使得 Pattern1 成立时, awk 会打开(turn on)这 switch.
当awk读入的数据行使得 Pattern2 成立时, awk 会关上(turn off)这个 switch.
该 Pattern 成立的条件是 :当这个 switch 被打开(turn on)时
例 如 :上例可改成
awk 'FNR==2,FNR==4{print $0}' emp.dat
例如:文件emp.dat
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
awk '$1~"^A.*",$1~"^P.*"{print $0}' emp.dat
当pattern1成立的时候turn on (switch)然后print $0,当读到第三行的时候pattern2成立,则turn off(switch)。此时已经输出前三行数据,当读到第四行的时候由于pattern1不成立,switch又是turn off的所以第四行不输出,当读入第五行的时候pattern1成立,turn on (switch)并会执行后面的actions输出第五行。