AWK手册(ZYF译)

来源:互联网 发布:网络举报中心电话 编辑:程序博客网 时间:2024/05/17 01:34

原始版本于1994年撰写并发表在SUN OBSERVER杂志上。
更新日期:2004年3月9日 美国东部时间11点07分08秒 星期二
更新日期:2007年2月16日 美国东部时间5点32分38秒 星期五  更新日期:2008年4月16日美国东部时间20点55分07秒 星期三
对于在文件上的操作来说,AWK是一个非常灵活的编程语言。在这个网页上,我们会尽可能给您提供易于掌握的例子:
下面的几个例子是关于部分文件名执行脚本的扩展。一旦您下载,并使其可执行,您可以对您想要的任意资讯进行重命名。
为什么学AWK?
之前我涉及过有关GREP和SED的讨论。本节要讨论的AWK,是另一个UNIX shell编程的基石。共有三类不同的AWK,分别是:
AWK¬—AT&T的原版。
NAWK—AT&T的新的升级版。
GAWK—自由软件基金会(一个组织)的版本。
开始,我并不想讨论NAWK,但是一些UNIX的供应商总是用NAWK代替AWK,并且还有一些不兼容性在这两者之间。若不把这些不同点告诉大家,对我来说将是极痛苦的事情。所以当我讲到这些问题是我将突出它们。所有AWK的特征都在NAWK和GAWK里面,了解这点很重要。若不能说是全部的话,则大部分NAWK的特征都在GAWK里。NAKI SHIPS
是Solaris造作系统的一部分,GAWK则不是。然而,在互联网上,许多网站都提供免费的消息来源。如果你用LINUX操作系统,你就已经在用GAWK了。但总的来说,除非另有说明,我讲的都将假定是经典的AWK。
为什么AWK如此重要呢?
它是一个出色的过滤器和汇报者,很多UNIX实用程序会生成行和列的信息。处理这些行和列,AWK是一个完美的工具,并且用AWK会比大多数传统的编程语言容易得多。您可以认为它是伪C的直译,因为它被认为和C的操作符一样。AWK也有字符操作函数,所以AWK可以搜索特定的字符串并且修改其输出。AWK还有相当重要的关联数组,这是很多其它计算机语言都缺乏的特征。关联数组可以让一个非常复杂的问题很轻易地解决。
我将不会详述AWK,我将会涉及更为重要的部分,避免许多AWK的变型出现。讨论三个不同版的AWK可能会使问题变得混乱。我不会讲述AWK的GNU版本,即所谓的“GAWK”。同样,我也将不会讨论新的AT&T AWK,即所谓的“NAWK”。新的AWK在SUN(一个公司)的操作系统上出现,并且你会发现它在很多方面优于老的AWK。尤其是它有更好的诊断方法,并且不会像原来的AWK一样诊断时出现类似于“在附近... ...行有问题可解决”等让人讨厌的信息。相反,“NAWK”会给它所不理解的画底线,并用箭头对准错的部分。GAWK也是这样做,并且这样做很有帮助。如果你发现你所需要的那个特诊在AWK里面很难或者不可能实现,我建议你要么用NAWK,要么用GAWK,或者将您的AWK脚本转换成PERL,从而用PERL配备的“a2p”转换程序实现。PERL是一种非凡的编程语言,并且我一直在用,但我不准备在本文中说明PERL,我已经阐述了我的目的,我可以问心无愧地继续本文。
许多UNIX实用程序都有很奇怪的名字,AWK便是其中之一。AWK不过是一个缩写上的尴尬而已,实际上,他是一个优雅而简单的名字,“AWK”源自于三大语言开发者:A.Aho、B.W.Kernighan和P.Weinberger。


基本结构
一个AWK编程语言的基本的机制有如下形式:
模式 { 功能 }  (pattern { action })
当执行功能时,其模式是指定的。像大多数的UNIX实用程序一样,AWK是线导向的。也就是说,模式指定一个正在执行的测试,这个测试的每行都作为输入。如果环境允许,那么功能就可以执行。默认的模式是可以跟每行都匹配。这就是空白或者无效的模式。另外两个重要的模式用“开始(BEGIN)”和“结束(END)”来指定。如您所想,这两个词在上一行度过之后和任意行被指定以前可执行其功能。AWK程序如下:
开始    {打印“start”}      BEGIN  { print "START" }
  {打印}                            { print }
结束     {打印“stop”}      END    { print "STOP" }
在输入文件的前后各加一行,这不是非常有用,但是一个简单的变化,我们就能让它变成一个典型的AWK程序。
BEGIN { print "File/tOwner"," }
{ print $8, "/t", $3}
END { print " - DONE -" }
我将会在下一个部分改进脚本,但我们可以称之为“FILEOWNER”。但我们尚不能将其放入一个脚本或文件中。我一会就可以讲到那里,坚持一下跟着我走你会深深体会到AWK的深意。
字符“/t”表示制表符(专业用语),以便于在每个界限上都有输出线。"$8" 和 "$3"有类似于shell脚本的含义,关于3和8,指的是第三和第八输入线的区域。你可以认为一个区作为一个栏,并且您所指定的功能可以在读入的任意行或列运行。
在AWK和一个有双引号的shell进程之间有两点不同,AWK理解指定字符按照“/”,比如字符t。Bourne和C UNIX shells却并不这样。此外,与shell(和PERL)不同,,AWK不在字符串中评估不变量。比如,第二行不能这样写:
{print "$8/t$3" }
那个例子不能打印出“$8 $3”,在引号里的$符号不是一个典型的特征值。另外,它对应一个区域。那第三和第八区时说明意思呢?考虑到Solaris系统里的"/usr/bin/ls -l" 命令,每个命令有八个信息栏。System V的版本(类似于Linux版) , “ / usr/5bin/ls - 1 , ”有9个栏目。第三栏是拥有者,并且第八(或第九)栏在这个文件名里。这个AWK编程语言可用于加快"ls -l"命令的生成,然后是拥有者为每个文件打印出文件名。我将为你演示.
更新:在Linux中,将"$8" 变成 "$9"。
另一个关于$符号的使用。在一些脚本语言比如PERL和各种SHELL语言中,单个$符意味着接下来的是一个变量。AWK则不同,$符意味着我们所指向的一个区或栏在当前列。当你在使用PERL和AWK两种不同的语言时,记住它们的$符的含义不同。因此,接下来的代码段打印出两个区域作为标准输出,打印出的第一区是数字5,第二个是在输入行的第五区(或栏)。
BEGIN { x=5 }
{ print x, $x}


执行一项AWK脚本
现在我们开始写第一个AWK 脚本,有两种方法。

 

原创粉丝点击