AWK语法入门[转]

AWK和GAWK 


在日常工作中,我们会遇到许多需要理解和提取文本的要求。一般来说,简单的要求,我们可以使用 grep,复杂的,可能会采用Perl 和其他的解决方案。在本系列文章中,我们要介绍的一种专门为文本处理和模式匹配而生的语言 AWK,这个古怪的名字其实来自于它的三个主要作者的首字母缩写:Drs. A. Aho、P. Weinberger 和 B. Kernighan。
简单描述一下AWK的工作方式:AWK的程序语句描述了需要处理的数据的模式和操作,运行时,AWK在其输入的数据中搜索包含模式的记录,然后对该记录进行指定的操作,,所以AWK非常擅长于处理数据库和表型数据,如从多个数据集中提取一些列、建立报表或分析数据等等。AWK能够用很短的程序对文档里的资料做修改、比较、提取、打印等处理,并且能和管道一起使用,是管理员和程序员一个不可缺少的工具。
AWK的主要功能是针对文件的每一行(line),也就是每一条记录,搜寻指定的格式。当某一行符合指定的格式时,AWK就会在此行执行被指定的动作。AWK依此方式自动处理输入文件的每一行直到输入文件档案结束。因此AWK也被称作是数据驱动的语言。AWK经常用在如下的几个方面:

  • 根据要求选择文件的某几行,几列或部分字段以供显示输出。
  • 分析文档中的某一个字出现的频率、位置等。
  • 根据某一个文档的信息准备格式化输出。
  • 以一个功能十分强大的方式过滤输出文档。
  • 根据文档中的数值进行计算。

AWK存在着几个不同的版本,比如早期的版本称为OAWK (old awk),而Dr. Kernighan 又维护了一个NAWK(New AWK),随着GNU项目的蓬勃发展,又出现了GAWK,它主要是为了替代OAWK,并包含了NAWK的一些特性。

GAWK被广泛应用Unix平台、Mac OS和Windows等诸多平台,本文提供了一个非常小巧的GWAK 3.1.0的Windows版本,以方便读者在Windows平台下学习AWK语言。请点击gawk(4)下载。

在下文中,AWK代表着通用的AWK语言,而GAWK,NAWK则代表着AWK语言解释器的某个实现。


如何运行GAWK
如果AWK程序很短,则可以将其直接写在命令行,如下所示:

gawk 'program' input_file1 input_file2...

 这里的program包括了模式pattern和动作action。在Windows平台, Program需要用双引号包围,而在Linux平台或者是Windows下的MSYS,则是用单引号包围起来。例如下面的例子,其作用和type命令是一样的。

gawk "{print}" setenv.txt

 如果AWK程序较长,较为方便的做法是将程序保存在文件中,然后如下执行GAWK:

gawk -f program_file input_file1 input_file2...

 如果AWK程序的文件不止一个时,执行GAWK的命令格式如下所示:

 

gawk -f program_file1 -f program_file2 ... input_file1 input_file2...

 
记录和字段
一般情况下,AWK可以处理文件中的数值数据,也可以处理字符串信息。除了文件之外,我们也可以通过管道命令和其他的重定向方法给AWK提供输入。当然AWK只能处理文本内容。比方说下面电话号码本就是一个AWK可以处理的文件的简单例子。

 

Smith Jane 13 Wilson St. 555-1283
Smith Jaskson 2736 Artside Dr Apt 123 555-2736
Smith John 125 Westmount Cr 555-1726

 在例子中,我们看到电话号码本由很多条目组成,每一个条目都有同样的格式:姓、名、地址、电话号码。每一个条目都是按字母顺序排列。在AWK中,每一个这样的条目叫做一个记录。它是一条完整的数据的集合。例如,电话号码本中的Smith John这个条目,包括他的地址和电话号码,就是一条记录。

记录中的每一项叫做一个字段。在AWK中,字段是最基本的单位。多个记录的集合则组成了一个文件。

大多数情况下,字段之间由一个特殊的字符分开,像空格、TAB、分号等。这些字符叫做字段分隔符。比如说下面这个/etc/passwd文件:

tparker;t36s62hsh;501;101;TimParker;/home/tparker;/bin/bash
etreijs;2ys639dj3h;502;101;EdTreijs;/home/etreijs;/bin/tcsh
ychow;1h27sj;503;101;YvonneChow;/home/ychow;/bin/bash

 你可以看出/etc/passwd文件使用分号作为字段分隔符。/etc/passwd文件中的每一行都包括七个字段:用户名;口令;用户I D;工作组I D;注释;home目录;启动的shell。

回顾前面那个电话号码本的例子,你就会发现一些问题:电话号码本使用空格作为分隔符,所以AWK认为Smith 是第一个字段,John是第二个字段,125是第三个字段,依次类推。就AWK而言,如果用空格作为字段分隔符的话,则第一个记录有六个字段,而第二个记录有八个字段。所以,我们必须找出一个更好的字段分隔符。例如,像下面一样使用斜杠作为字段分隔符:

Smith/Jane/13 Wilson St./555-1283
Smith/Jackson/2736 Artside Dr/Apt/123/555-2736
Smith/John/125 Westmount Cr/555-1726

 如果你没有指定其他的字符作为字段分隔符,那么AWK将缺省地使用空格或TAB作为字段分隔符。


模式和动作
在AWK语言中每一个命令都由两部分组成:一个模式(pattern)和一个相应的动作(action)。只要模式符合,AWK就会执行相应的动作。其中模式部分用两个斜杠括起来,而动作部分用一对花括号括起来,即:

/pattern/{action}

 AWK程序都是由这样的一对对的模式和动作组成的。其中模式或动作都能够被省略,但是两个不能同时被省略。如果模式被省略,则对于作为输入的文件里面的每一行,动作都会被执行。如果动作被省略,则缺省的动作被执行,既显示出所有符合模式的输入行而不做任何的改动。
下面是一个简单的例子:

 

gawk "/John/{print $2}" contact.lst

此程序逐行查找上面的电话号码本中包含"John"的记录并打印这些记录的第二个字段。
你也可以在一个命令中使用多个模式和动作对,例如:

 

 

gawk "/scandal/{print $1}/rumor/{print $2}" gossip_file

此命令搜索文件gossip_file中包括scandal的记录,并打印第一个字段。然后再从头搜索gossip_file中包括rumor的记录,并打印第二个字段。

 

 

小结
在本文中,我们简单介绍了AWK语言的工作模式和应用场景,使读者对其工作方式有了一个概括性的了解,同时我们通过几个简单的例子演示了GAWK的一些用法。在后续的文章中,我们将学习AWK语言的详细语法。

 

 

来源:http://blogs.ejb.cc/archives/1654

你可能感兴趣的:(awk)