awk学习笔记七-Pattern

原文:http://doc.lazyhack.net/awk.htm

 

AWK Pattern

Awk通过判断pattern的值来决定是否执行对应的actions,常见的pattern

1、BEGIN

BEGINawk的保留字,一种特殊的patternBEGIN成立(值为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 } .....

 

2、END

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的值到标注输出。

3、关系表达式

关系表达式当成pattern时,当关系成立则执行对应的actions

Awk中的关系运算符包含:

大于

小于

>= 大于或等于

<= 小于或等于

== 等于

!= 不等于

~ match

!~ not match

 A 为一字符串, B 为一正则表达式.

A ~B 判断 字符串中是否 包含 能匹配(match)B式样的子字符串.

A !~B 判断 字符串中是否 未包含 能匹配(match)B式样的子字符串.

例如:

awk 'length($0) <= 16 { print $0 }' emp.dat打印数据行字符数小于等于16的行

awk '$1~"^A.*"{print $0}' emp.dat打印$1匹配以A开头的数据行

4、混合pattern

各种 Pattern的结果为一逻辑值(True or False).awk中逻辑值彼此间可通过&&(and), ||(or),  !(not) 结合成一个新的逻辑值.Patterns 彼此可通过上述结合符号来结合成一个新的 Pattern进行复杂的条件判断.

  :

awk 'FNR>=2 && FNR<=4{print $0}' emp.dat通过&&将两个pattern结合成一个pattern,将打印文件中的2-4行数据,FNR表示读取文件正在处理的行数

5、Pattern1pattern2

遇到这种 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输出第五行。

 

你可能感兴趣的:(Pattern,awk,休闲,awk笔记,awk匹配)