Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164317
  • 博文数量: 18
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 201
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-02 11:26
文章分类

全部博文(18)

文章存档

2015年(2)

2014年(4)

2012年(12)

我的朋友

分类: LINUX

2012-11-11 22:47:41

AWK基本作用:在输入流里按行搜寻匹配的模式并处理。
如果是命令行输入awk语句基本的格式是: awk [optoins] 'statement'  file,也可以通过管道传入 cmd | awk [optoins] 'statement'  file 。也可以把awk语句写到一个文件里面去执行,调用方式是:awk -f program_file  file.
一个条awk语句分为了3个block:由BEIGN{....},END{....},和普通的awk语句组成。其中BEGIN这个块里面的语句执行于awk的处理程序之前,相应的END块执行awk处理之后,真正处理输入流的是中间那段普通的awk语句。BEGIN,END,流处理语句,在awk文件或者命令行放置的先后顺序是没规定的,出现的次数也是没规定的,也就是说出现0,1,N次都是可以的,只是BEGIN和END块必须被{}包围,awk只按照他们所属的块来进行先后处理。
那么BEGIN和END块既然不处理输入流,那他们做些什么呢?
BEGIN:主要是进行一些awk内建变量的初始化。常用的这些内建变量有:
FS:field separator,域分隔符。
     前面所说awk基本作用是匹配和处理,处理就包括把输入流按分隔      符分成不同的域。FS不仅可以是指定的字符或者字符串,也可以是      一个正则表达式。
OFS:output field separator,输入域分隔符。
      把输出的域按OFS隔开,只是要注意,变量要用“,”隔开,否则达不       到预期效果。例如:{print $1 $2}和{print $1,$2},只有后者       才会有效果。
ORS:output record separator,输出记录分隔符。所谓记录,就是一 次awk匹配得到的结果。依我的理解,awk处理过程如下:

BEGIN block     
      BEGIN{}
        normal block    
        while(end of stream)
      {
match;
process;
NR++;
      }
END block        
      END{}
     一个记录就是一轮while循环,ORS就是用来分隔这样一个记录 的。
NR:number of record,记录数。每完成一次匹配就会自增。

END:具体有什么特殊用途不知道。

normal block部分也可以加入一些正则表达式进行处理用: /regular expr/

既然后build-in变量那么也就会有user define 变量。如下例子:

kelly@octarine ~> cat revenues
20021009 20021013 consultancy BigComp 2500
20021015 20021020 training EduComp 2000
20021112 20021123 appdev SmartComp 10000
20021204 20021215 training EduComp 5000
kelly@octarine ~> cat total.awk
{ total=total + $5 }
{ print "Send bill for " $5 " dollar to " $4 }
END { print "---------------------------------\nTotal revenue: " total }
kelly@octarine ~> awk -f total.awk test
Send bill for 2500 dollar to BigComp
Send bill for 2000 dollar to EduComp
Send bill for 10000 dollar to SmartComp
Send bill for 5000 dollar to EduComp 
--------------------------------- 
Total revenue: 19500

print和printf
通常awk用到的输出函数是print,有时候为了更精确的指定输出的格式,可以用printf,在awk里面的printf和C语言里面的printf用法是一样的。


以上都是一些皮毛,并且由于我的菜,表述并不一定正确,如果碰巧有人看到我的这段文字,不要全信。最好man一下,man awk的内容太多了,不过很全面。
阅读(2001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~