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 教程入门到精通 awk 是一种功能强大的文本处理工具,它可以对文本进行处理、格式化和输出。awk 的主要用途是处理文本文件,提取和处理数据,生成报表等。下面是一份 awk 教程,从基础知识到高级应用,涵盖了 ...
《awk入门到精通》这本书是针对Linux环境下的awk语言学习指南,主要讲解了awk作为一款强大的文本处理工具的使用方法。awk是一种编程语言,它的特点是无需预编译,使用直译器,变量无类型,支持关联数组,这使得awk...
### awk实例入门教程知识点解析 #### 一、awk语言简介 awk是一种专为文本处理设计的强大脚本语言,尤其适用于数据格式化、过滤和报告生成。它的命名来源于三位创造者:Alfred Aho、Peter Weinberger 和 Brian ...
### awk入门详解 #### 一、awk简介 **awk** 是一种在 UNIX 和 Linux 系统上广泛使用的强大工具,它被设计用于处理文本数据,尤其是对于那些需要进行模式匹配和数据处理的任务非常有效。虽然 **awk** 的名字看起来...
**awk入门最好的资料** 在IT领域,awk是一个强大的文本分析工具,它被广泛用于处理和解析日志文件、数据报告和其他结构化的文本信息。本文档是awk初学者的理想起点,通过深入浅出的方式,帮助读者快速掌握awk的基本...
在AWK中,有多种语法结构,比如可以通过命令行直接传递awk语句,或者通过调用包含awk代码的外部文件。例如,例1展示了如何通过命令行传递变量`a`的值并指定输入和输出文件。而例2则演示了直接在命令行中使用模式匹配...
**awk基本语法** awk的工作方式是:针对文件中的每一行,检查一行是否匹配给定的模式(正则表达式)。如果匹配成功,就执行相应的动作。基本语法结构如下: ```awk awk '模式 {动作}' ``` 例如,要打印所有包含单词...
本资料包是针对awk脚本学习的快速入门教程,旨在帮助初学者快速掌握awk的基本用法和高级技巧。 一、awk简介 awk是由Aho、Weinberger和Kernighan三位大牛命名的(取首字母),最初设计用于处理结构化的文本数据,如...
对于所使用的awk语法及指令,本书都辅以必要的说明。 为了快速掌握awk解决问题的模式及特性,建议读者循着书中的实例上机实习,以加深学习效果。在开始学习awk之前,读者需要具备一些基础背景知识,包括UNIX环境下...
例如,使用Emacs编辑Awk脚本,利用Emacs的自动补全和语法高亮功能提高编程效率;然后运行脚本处理大量文本数据,输出结果可以直接在Emacs中查看和分析。 在学习Emacs和Awk的过程中,建议先从基础操作开始,逐渐熟悉...
awk语法 基本的awk命令格式如下: ```bash awk 'pattern { action }' ``` - `pattern`:匹配的模式,如果省略,则默认为真,即处理所有行。 - `{ action }`:匹配模式后的动作,可以包含变量赋值、条件判断、...
【sed和awk最佳入门教程——摘自《实战linuxshell编程与服务器管理》.pdf】 在Linux Shell编程中,sed和awk是两个强大的命令行工具,它们对于数据处理和文本操作有着不可替代的作用。本教程主要介绍了这两个工具的...
awk 中文手册入门到精通 awk 是一种功能强大且灵活的 programming 语言,能够轻松地处理文本文件和数据处理任务。在本手册中,我们将从基础知识开始,逐步深入到 awk 的高级应用,旨在帮助读者快速掌握 awk 的使用...
AWK编程入门 - **前言**:介绍了本手册的目的在于引导初学者掌握AWK的编程基础,并通过实践加深理解。 - **背景要求**:读者应具备基本的UNIX环境操作知识,包括文件编辑、复制以及管道和I/O重定向的概念,同时...
本书的结构清晰,内容详实,包括了AWK程序的快速入门、基本语法、数据处理、报表生成、文本处理、小型语言、算法实验以及后记等部分。 第一章快速入门部分介绍了AWK程序的结构和运行方式,包括如何处理错误。初学者...
awk语法基础** awk程序由一系列规则组成,每个规则包括一个模式和一个动作。模式定义了在哪些行上执行动作。例如: ```bash awk 'pattern { action }' ``` 当输入数据匹配到模式时,就会执行相应的动作,动作可以是...
- **基本语法**:`/regexp/` - `/^\d{2}\.[0-9][0-9]\.$/`:匹配以两位数字开头,中间一位数字,末尾一个小数点的行。 - **比较运算符**: - `==`:等于 - `!=`:不等于 - `小于 - `>`:大于 - `小于等于 - `...