书籍作者:Alfred V.AHO, Brian W.Kernighan, Peter J.Weinerger
AWK 是一种方便而又富有表达力的编程语言,可以用于广泛的计算与数据处理任务。这一章是一篇教程,是为了让你尽可能快的写出你自己的程序而设计的章节。第二章将描述这个语言的整体,而剩下的章节将会向你展示AWK可以如何解决一些来自不同领域的问题。透过整本书我们试着去挑选出一些你会觉得有用,有趣,有益的例子。
1.1 开始吧
有用的AWK程序通常很短,只需要一到两行。假设你有一个文件称 emp.data 包含了你的员工们的 名字,每小时工资费率 和 工作小时数。一个员工一行,就像这样:
Bath 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
现在你想打印出工作小时数大于零的员工的姓名与工资(小时乘上每小时工资)。这种工作对AWK来说,太简单了。只需要输入这个命令:
awk '$3 > 0 {print $1, $2*$3}' emp.data
你应当得到这个结果:
Kathy 40
Mark 100
Mary 121
Susie 76.5
这个命令行告诉系统去运行awk, 使用引号内的程序的从emp.data中提取数据。包含于单引号内的部分是完整的awk程序。这由一个单次的“识别(模式)-执行(动作)”语句组成。‘模式‘$3>0,匹配了每一个'第三列(或者是 域)大于3' 的输入行,而 ‘动作’ { print $1, $2 * $3 } 打印了每一个符合要求的行的:第一个域的值,和第二、第三域的积。
如果你想打印出那些没有上班的员工们的名字,输入这行命令:
awk '$3 == 0 { print $1 }' emp.data
这里的‘模式’,$3 == 0 匹配上了所以第三个域为0的输入行,然后‘动作’ {print $1}打印它们的第一个域。
当你读这本书时,试着运行和修改展示出来的这些代码。大部分都非常短,你可以很快的了解awk是怎么样运行的。在UNIX系统,先前的两个分析在终端上将看上去和这个差不多:
$由系统决定
awk程序的结构
让我们暂时退一步看看到底发生了什么。在命令行前面,被引号包围的是awk程序,在这一章中的每一个awk系列都是由一个或多个“识别-执行”语句组成的:
patter {action}
patter {action}
......
awk的基本操作是一个接一个地扫描一连串输入行,寻找任何一个配对上的输入行。match的意思是由pattern决定的;$3>0代表的是"当这个条件为真时“。
每一个输入行根据每一个条件来
,对任何一个匹配的‘条件’,其相应的‘动作’都将会被执行。然后下一行又开始被读取并再次进行匹配。这将持续到所有的输入都被读取。
先前的程序就是典型的一个带‘模式’和‘动作’的例子。(先识别模式,然后判断是否执行)
$3 == 0 { print $1 }
这是单个语句;对每一行的第三个域,如果是零,打印第一个域的内容。
不是patten就是action,如果模式它没有对应的动作,比如
$3==0
所有匹配的都会打印出来,从emp.data将会打印第三个域为零的那两行:
如果只有动作没有有条件,在这里它将打印每一行的第一个域
运行AWK程序
有几种方法来运行AWK程序。你可以输入以下形式的命令行:
awk 'program' input files
运行这个在每一个特定的输入文件,你可以输入: awk '$3==0 {print $1}' file1 file2 来打印出file1和file2中的每个满足第三个域为零那行的第一个域。
你可以省略命令行中的输入文件,直接输入: awk 'program'
在这个情况下awk会载入到program