数据处理工具之awk

1.awk是以行为一次处理的单位,而以字段为最小的处理单位。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。


2.awk命令的格式

awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

备注,awk可以同时处理多个文件,比如可以使用通配符来指定多个文件,eg: testfile*


awk常用的选项如下:

-F  用来设定分隔符

-v var=val   在awk语句执行前,设定一个var的变量,变量的值为val,然后可以在awk语句中使用。


awk使用范例:

eg. last -n 5 | awk '{print $1 "\t" $3}'
eg. grep -o -P '(?<=ItemsCount:)\d+' apache.log | awk 'BEGIN{sum=0;} {sum=sum+$1} END{print sum/NR}'
eg. cat stat.log | awk '$2<=25000{a++} $2>25000&&$2<=30000{b++} $2>30000{c++} END{print "item<=25000: "a"\n""2500030000: "c}'
eg. cat stat.log | awk 'BEGIN{OFS="_"} {print $1,$2,$3}'    #那么awk输出的$1,$2,$3之间的分割符就是下划线,注意这里面$1,$2,$3之间的逗号是必须的。
eg. ps aux | awk -v pid=17782 '{if($2==pid){print $9}}'
eg. cat test.log | awk '$5==0{a[$3]++; next} {b[$3]++} END{for(i in a) print i}'  #咋awk中使用数组以及for循环


3.awk的三种调用方式

(1)命令行方式
awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

(2)shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一般通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk

(3)将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

4.awk中几个常见的变量

$0:表示一整行。

$n:表示第n列。

NF:每一行拥有的字段的总数。

NR:目前awk所处理的是第几行数据。

FS:目前的字段分隔字符,默认是空格键。

OFS:awk处理完之后的输出行中各字段的分隔符,默认为空格符。

RS:行记录间的分割符,默认为\n

ORS:awk处理完之后的输出行中各行的分隔符。

FILENAME:awk当前正在处理的文件的文件名。


另外awk命令中还有BEGIN,END关键字。


5.awk中调整分割符的两种方法

(1)cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}'

(2)cat /etc/passwd | awk -F ‘:’ '$3<10 {print $1 "\t" $3}'

(3)echo "aaaaa:bbbbbbbb;cccccc:ddddddd" | awk -F ':|;' '{print $1,$2,$3,$4}'  #-F可以指定多个分割符,中间用|分割,|符号前后的字符都将作为awk分割符 

备注:cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t" $3}'是不行的,因为第一行的内容将不会以:进行分割。因为awk的处理流程是这样的,读入待处理文本的第一行,然后在判断条件类型。


6.将awk执行动作放入到一个文件中

形式为:awk f program_scripts inputfile

这样可以把处理操作放到program_scripts文件中。

program_scripts中,格式是模式{动作}

pattern1{

action1

}

……

pattern n{

action n

}

 
如果第一个模式名为BEGIN,最后一个模式名为END.
那么,表示的含义如下:
任何在BEGIN中包含的动作action将在Unix awk开始扫描输入之前执行,而END中包含的动作action将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

7.awk、nawk、mawk以及gawk区别

像shell一样,awk也有好几种,常见的如awk、nawk、mawk、gawk,其中
(1)awk

   最初在1977年完成,1985年发表了一个新版本的awk,它的功能比旧版本增强了不少,awk 能够用很短的程序对文档里的资料做修改、比较、提取、打印等处理,如果使用C或Pascal等语言编写程序完成上述的任务会十分不方便而且很花费时间,所写的程序也会很大;
(2)nawk

   在 20 世纪 80 年代中期,对 awk语言进行了更新,并不同程度地使用一种称为 nawk(new awk) 的增强版本对其进行了替换。许多系统中仍然存在着旧的awk 解释器,但通常将其安装为 oawk (old awk) 命令,而 nawk 解释器则安装为主要的 awk 命令,也可以使用 nawk 命令。Dr. Kernighan 仍然在对 nawk 进行维护,与 gawk 一样,它也是开放源代码的,并且可以免费获得;
(3)mawk

   mawk 是 awk 编程语言的解释器。awk语言在多媒体数据文件以及文本的检索和处理,算法的原型设计和试验都有广泛的使用。mawk带给awk新的概念,它实现了在《The AWK Programming Language》(Aho, Kernighan and Weinberger, The AWK Programming Language, Addison-Wesley Publishing, 1988.被认为是 AWK 手册。)中定义的 awk语言。mawk遵循 POSIX 1003.2 (草案 11.3)定义的 AWK 语言,包含了一些没有在AWK 手册中提到的特色,同时 mawk 提供一小部分扩展,另外据说mawk是实现最快的awk;
(4)gawk

   gawk是 GNU Project 的awk解释器的开放源代码实现。尽管早期的 GAWK 发行版是旧的 AWK 的替代程序,但不断地对其进行了更新,以包含 NAWK 的特性;

   目前,大家都比较倾向于使用awk和gawk,本文中要介绍的awk是以GUN的gawk为例的。



学习资料参考于:

http://blog.sina.com.cn/s/blog_3d2d79aa0100h47h.html

你可能感兴趣的:(ShellScripts)