awk的学习和使用(四)

上一篇 / 下一篇  2009-08-18 23:09:26 / 个人分类:Linux

 
在本系列的(一)中,学习了以下几个部分:
awk的三种调用方式:命令行式、使用-f选项调用awk文件、将#!/bin/awk -f添加到awk文件首行。
awk语法
awk的记录、字段和内部变量
awk的内置函数
awk的自定义变量
 
下面将继续学习后面的部分:awk的运算与判断awk的流程控制awk中的正则表达式awk与shell的混合编程
 
一、awk的运算与判断
awk支持多种运算,这些运算与c中的基本相同。
运算符:+、-、*、/、%、++、--、+=、-=、=+、=-等;
运算函数:log、sqr、cos、sin、length、substr等;
条件测试:==、!=、>、<、>=、<=等;
逻辑运算符:!、&&、||、()等;
 
二、awk的流程控制
BEGIN和END
在awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):

$awk
>'BEGIN { FS=":";print "统计销售金额";total=0}
>{print $3;total=total+$3;}
>END {printf "销售金额总计:%.2f",total}' sx
(注:>是shell提供的第二提示符,如要在shell程序awk语句和awk语言中换行,则需在行尾加反斜杠\)

在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。

流程控制语句
awk提供了完备的流程控制语句,其用法与C语言类似:
if...else语句
while语句
do-while语句
for语句
 
三、awk中的正则表达式
对于awk而言正则表达式是置于两个正斜杠之间、由字符组成的模式。正则表达式位于awk语法中的pattern。如果输入行中的某个字符串与正则表达式相匹配,则最终条件为真,于是执行与该表达式关联的所有操作如果没有指定操作则打印与正则表达式匹配的记录
例:显示文本文件mydoc匹配(含有)字符串"sun"的所有行。
$awk '/sun/{print}' mydoc
由于显示整个记录(全行)是awk的缺省动作,因此可以省略action项。
$awk '/sun/' mydoc
例:下面是一个较为复杂的匹配的示例:
$awk '/[Ss]un/,/[Mm]oon/ {print}' myfile
它将显示第一个匹配Sun或sun的行与第一个匹配Moon或moon的行之间的行,并显示到标准输出上。
如何查找第一个字段匹配正则的行?
例子:查找第一个字段中带有sun字符串的行,并打印;
$awk -F"\t" '$1~/sun/{print $1 "\t" $2}' filename 
awk中逗号分隔的两个pattern,表示对满足第一个pattern,到满足第二个pattern之间的行(包括满足pattern1的行,不包括满足pattern2的行),执行action操作。如我们常用的:
awk 'NR==2,NR==5 {print $0} myfile'
表示打印第二行到第四行。

 
四、awk与shell的混合编程
1.awk读取Shell script程序变量
在awk中我们可以通过“'$变量名'”的方式读取sell scrpit程序中的变量。
例:在下面的示例中,我们将读取sell scrpit程序中的变量Name,该变量存放的是文本myfile的撰写者,awk将打印出这个人名。 
下面给出两种方式:
第一种比较常用的方式:(双引号和单引号的意义需要明确)
#!/bin/sh
name='John'
awk '{print $1,$2,"'$name'"}' myfile
-------------------------------------------------
第二种方式:
#!/bin/sh
name='John'
awk '{print $1,$2,myname}' myname=$name myfile
不过这种方式中,awk自定义变量myname不能在BEGIN中使用。
 
2.将shell命令的执行结果送给awk处理
作为信息传送的一种方法,我们可以将一条shell命令的结果通过管道线(|)传递给awk处理:
例:示例awk处理shell命令的执行结果
$who -u | awk '{printf("%s正在执行%s\n",$2,$1)}'
该命令将打印出注册终端正在执行的程序名。

3.shell script程序读awk的执行结果
shell中可以将awk执行结果赋值给shell变量。我们可以用变量名=`awk语句`的形式将awk执行的结果存放入一个shell script变量。当然也可以用管道线的方法将awk执行结果传递给shell script程序处理。
下面给出变量名=`awk语句`的方式(注释,awk语句必须使用键盘左上角的反引号引起来。)
下例为:找出myfile中带有fail字符串的行并统计行数,最后打印出格式为:there are (行数) lines
#!/bin/sh
temp=`awk '/fail/{print $0}' myfile |wc -l`
echo "there are $temp lines" 

3.还有其他shell、awk混合编程的方式,由于本人对shell不是很熟,请参见原文吧。

TAG:

 

评分:0

我来说两句

Open Toolbar