友情提示:本站最近进行了改版升级,如出现显示异常,请刷新页面或清除一下缓存!

  下面为awk程序指令的模型,每个awk程序都是由一些列下面形式的语句组成,从而完成特定的功能:

Pattern { Action }

  awk通过Pattern(模式)来控制是否处理当前记录,如果当前记录和Pattern匹配,则执行Action(操作)。在awk中,有下列几种模式:

1、正则表达式

2、关系表达式

3、组合的Pattern

4、Pattern1,Pattern2

5、BEGIN

6、END

  为了说明以上各种模式,我们这里准备一个文件score.txt,以实例的方式一一进行说明,score.txt文件内容如下:

zhaosan 85 92 78
lisheng 89 90 75
zhaoyun 84 88 80
guanyu 83 78 90
liubei 86 88 79

  这是一个比较简单的学生成绩表,共有5个学生的成绩,每条记录包含名字,其后跟的是三门课的成绩,分别算是语文、数学和英语的成绩吧。

1、正则表达式

CodingAnts@ubuntu:~/awk$ awk '/9[0-9]/ {print $0}' score.txt
zhaosan 85 92 78
lisheng 89 90 75
guanyu 83 78 90

  以上指令查询有一门课成绩在[90-99]区间的学生的成绩信息,蓝色部分即为awk程序指令中的Pattern,这里Pattern的类型为正则表达式。

CodingAnts@ubuntu:~/awk$ awk '$3 ~ /9[0-9]/ {print $0}' score.txt
zhaosan 85 92 78
lisheng 89 90 75

  这条指令在上一条指令的基础上增加了限制,需要第二门课(数学)成绩在[90-99]区间才可与模式匹配。这里的 ~ 操作符用来表示变量是否与正则表达式匹配,如果要判断不匹配,可以使用 !~ 操作符。

2、关系表达式

CodingAnts@ubuntu:~/awk$ awk '$3 >= 90 {print $0}' score.txt
zhaosan 85 92 78
lisheng 89 90 75

  可用来形成模式关系运算符包括: <(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)、= =(等于)和 ! =(不等于)。

  这条指令的作用也是查询数学成绩在90分以上的学生成绩信息,不过比正则表达式中的范围要大一点,这里100分也是符合模式的。

3、组合的Pattern(模式)

CodingAnts@ubuntu:~/awk$ awk '$3 >= 90 && $3 < 100 {print $0}' score.txt
zhaosan 85 92 78
lisheng 89 90 75

  布尔运算符 ||(或)&&(和)以及 !(不)将模式组合,组合后如果求值为真则模式匹配,否则不匹配。这里就解决了关系表达式示例中包含了100的问题。

4、Pattern1,Pattern2

CodingAnts@ubuntu:~/awk$ awk 'FNR == 2 , FNR == 4 {print $0}' grades
lisheng 89 90 75
zhaoyun 84 88 80
guanyu 83 78 90

  其实这个也可以归为组合的模式中,只是这种模式比较特殊,故单独列出。以,(逗号)隔开的两个Pattern指定一个范围,对从匹配第一个Pattern的记录开始,到匹配第二个Pattern结束的所有记录执行Action。

5、BEGIN

  BEGIN模式是awk的一种特殊的Pattern,BEGIN模式指定的操作在读取任何输入之前执行,且只执行一次。使用BEGIN模式甚至不需要指定输入文件,一般把与数据文件内容无关以及只需要执行一次的部分置于以BEGIN模式为Pattern的Action中。

  假如我们要将学生成绩表打印出来,那总得加点表头什么的吧,就可以放到BEGIN中了。

CodingAnts@ubuntu:~/awk$ awk 'BEGIN { print "Print student score table"}'

6、END

  END模式也是awk中一种特殊的Pattern,END模式指定的操作在读取所有的输入后执行。

CodingAnts@ubuntu:~/awk$ awk 'END { print "Work done"}' score.txt

7、总结(综合示例)

  下面通过一个例子,来演示以上模式的使用。假设我们需要打印前4个学生的成绩,为了方便我们把所有的awk指令写入到一个文件中,文件起名为score.awk,内容如下:

BEGIN {OFS="\t"; print "name\tyuwen\tshuxue\tyingyu"}
FNR==1,FNR==4{print $1,$2,$3,$4}
END {print "Work done!"}

执行脚本后结果如下:

CodingAnts@ubuntu:~/awk$ awk -f score.awk score.txt
name    yuwen   shuxue  yingyu
zhaosan 85      92      78
lisheng 89      90      75
zhaoyun 84      88      80
guanyu  83      78      90
Work done!

转载请注明:Coding Ants » awk中的各种模式(Pattern)详解

相关文章

我来说说

(便于我们更好的交流)

没有交流就没有进步,在此输入您对本文的看法!
取消