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完整教程 0基础入门到精通 awk完整教程 0基础入门到精通
awk 是一门编程语言,它的基本操作是在一组文件上查找模式,并在包含这些模式实例的那 些行或字段上进行指定的动作。awk 使得特定数据的选择和变换操作更易于表达
awk 实例入门 教程 AWK_样式扫描和处理语言
1. 前言 这是一本awk学习指引, 其重点着重于 : awk 适于解决哪些问题 ?...本手册为awk入门的学习指引, 其内容将先强调如何撰写awk程序,未列入进一步解题方式的应 用实例, 这部分将留待UNIX进阶手册中再行讨论.
shel awk 学习:Shell编程下的AWK语法小结
awk 快速入门包含sed 正则表达式 awk 快速入门包含sed 正则表达式
awk编程语言入门--awk是linux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等。
shell awk从入门到精通是本人经过多年工作总结的经验。 本资源适用linux爱好者、shell爱好者及大数据爱好者。
能够快速了解awk,能够利用awk简单处理文档
awk学习快速入门、基本用法、高级应用。基本入门说明使用的基本方法;高级应用主要是管道的用法
AWK入门教程和实战案例 linux脚本
linux管理员很有用的工具,资料适合初学者
Awk入门教程。作者 Bruce Barnett 注:英文版。以下是目录 Why learn AWK? Basic Structure Executing an AWK script Which shell to use with AWK? Dynamic Variables The Essential Syntax of AWK ...
AWK入门指南,正则表达式使用,高级输出,控制语句,语言详解
awk 脚本 shell编程 实例教程 简单易懂
awk入门及提高.pdf
非常好的awk文档,深入浅出 一段代码,一段例子,很适合入门
AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。
收集的awk脚本学习 快速入门 包含sed 和正则表达式 不好用 别下 我重新上传