中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [分享]专用的文本数据处理脚本语言--Gawk快速入门教程
作者:
标题: [分享]专用的文本数据处理脚本语言--Gawk快速入门教程 上一主题 | 下一主题
yyying67
新手上路





积分 19
发帖 11
注册 2008-7-10
状态 离线
『楼 主』:  [分享]专用的文本数据处理脚本语言--Gawk快速入门教程

Awk是一种可以方便地处理结构文本数据并输出格式化结果的编程脚本语言,堪称数据引擎,Awk的名称是用三位作者"Alfred V.Aho, Peter J.Weinberger, Brian W.Kernighan"姓氏的首字母来命名。gawk 是GNU所做的awk开源版本,gawk包含awk的所有功能,并增加了许多强大的新功能。

Awk通常被用来进行模式扫描和处理。通过扫描一个或多个文件中的行,查看是否匹配指定的模式,并执行相关的操作。

Awk的主要特性包含:
* Awk以记录和字段的方式来查看文本文件。
* 具有便捷奇特的数据驱动和模式匹配语法:search pattern {Actions}。
* 有管导操作和文件输入输出功能。
* 有关联数组。
* 和其他编程语言一样,Awk包含变量、条件和循环语句。
* Awk能够进行运算、字符串操作和匹配正则表达式。
* Awk能够生成格式化的报表数据。

Awk从一个文件或者标准输入中读取数据,并输出结果到标准输出中。

Awk的命令行用法:
Usage1: gawk [options] "program" file ...
Usage2: gawk [options] -f progfile file ...

在上述用法中:
  * gawk – 命令的名字。

  * [options] – 命令的选项,在命令行下输入gawk并按下回车键,会显示全部命令选项的具体用法,其中的中括号表示选项可以省略。

  * "program" – 如果在命令行上或批处理文件里输入Awk脚本语言,要用双引号围住Awk脚本语言,其中双引号的作用是保护双引号所包围的脚本语言不被Windows命令行shell解释他的特殊字符而改变原貌。由于Windows命令行shell的特性原因,双引号对不能完全保护里边的所有特殊字符。因此,如果双引号对里边又包含有双引号,里边的双引号前面要插个反斜线;如果双引号对里边包含有百分号,要在百分号前面再插一个百分号。另,Windows命令行上输入的命令不能跨行。

  * file – 输入文件名。

  * -f progfile – 从progfile文件( Awk脚本语言文件)中读取Awk脚本语言(可将Awk脚本语言存放在单独的文件中)。

Awk的脚本语言语法:
search pattern1 {Actions}  
search pattern2 {Actions}
……
search patternN {Actions}
  
在上述语法中:
   * search pattern是查找数据的布尔表达式,如果是正则表达式,要用斜线围住。
* Actions – 被执行的语句,大部分语句与C语言相似,用一对大括号围住,包围动作的左括号要与search pattern同在一行。
* 在Awk 中可以存在多个search pattern {Actions}。

Awk的工作方式:
1)Awk 一次读取文件中的一行。
2)对于一行,按照给定的search pattern的顺序进行匹配,如果匹配则执行对应的 Action。
3)如果没有匹配上则不执行任何动作。
4)在上述的语法中,search pattern 和 Action 是可选的,但是必须提供其中一个。
5)如果 search pattern 未提供,则对所有的输入行执行 Action动作。
6)如果 Action 未提供,则默认打印出该行的数据。
7){} 这种 Action 不做任何事情,和未提供的 Action 的工作方式不一样。
8)Action 中的语句应该使用分号分隔。

创建一个包含下面内容的文本文件employee.txt。后续的例子中将会用到该文件。

命令行:  
> type employee.txt
100  Thomas Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Sanjay  Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   DBA      Technology  $6,000  
  
例1:Awk 的默认行为。
默认的时候awk 打印文件中的每一行。

命令行:  
> gawk "{print;}" employee.txt   
100  Thomas  Manager    Sales     $5,000  
200  Jason   Developer  Technology  $5,500  
300  Sanjay  Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   DBA      Technology  $6,000  
  
在上述的例子中,匹配的search pattern未给出,因此后续的Action 适用所有的行,Action 中的print 没有任何参数的情况下将打印整行,注意其中的 Action 必须使用 {} 括起来。

例2:Awk打印匹配的行。

命令行:  
> gawk "/Thomas/;/Nisha/" employee.txt   
100  Thomas  Manager    Sales       $5,000  
400  Nisha   Manager    Marketing   $9,500  
  
在上述的例子中,将打印包含Thomas 和 Nisha 的行,上面的例子只包含两个正则表达式。 Awk 可以接受任意数量的search pattern,如果多个search pattern写在同一行时,他们之间要用分号分隔。

例3:Awk仅打印指定的字段。

Awk包含许多内建的变量,对于每行的记录,Awk根据内建变量FS(代表字段分隔符)的值(默认值为空格)进行分割,并将分隔后的值(字段)存入对应的 $n 变量中。例如一行有4个单词,将被分别存储进 $1 、$2 、$3 、$4四个变量中,整一行被存储进$0变量中。内建变量NF,代表该行中分割后的变量数。内建变量FNR,代表已读取当前数据文件的行数。内建变量RS,代表数据文件的记录分隔符,默认值为换行符。

命令行:  
> gawk "{print $2,$5;}" employee.txt   
Thomas $5,000  
Jason $5,500  
Sanjay $7,000  
Nisha $9,500  
Randy $6,000  

> gawk "{print $2,$NF;}" employee.txt   
Thomas $5,000  
Jason $5,500  
Sanjay $7,000  
Nisha $9,500  
Randy $6,000  
  
在上述例子中$2 和 $5 分别代表名字和薪水,也可以使用 $NF 获得薪水,其中 $NF 代表最后一个字段,在打印语句中逗号是一个连接符号,连接符号的实际值是在内建变量OFS中设置,默认值为空格。

例4:Awk开始和最后的动作。
Awk包含两个重要的关键字 BEGIN 和 END。

语法:
BEGIN { Actions}   
END { Actions }

在BEGIN 节中的 Actions 会在读取文件中的行之前被执行。
而END 节中的 Actions 会在读取并处理文件中的所有行后被执行。

命令行:  
> gawk "BEGIN {print \"Name\tDesignation\tDepartment\tSalary\";} {print $2,\"\t\",$3,\"\t\",$4,\"\t\",$NF;} END {print \"Report Generated\n--------------\";}" employee.txt
Name Designation Department Salary  
Thomas   Manager   Sales       $5,000  
Jason   Developer   Technology   $5,500  
Sanjay   Sysadmin   Technology   $7,000  
Nisha   Manager   Marketing   $9,500  
Randy   DBA     Technology   $6,000  
Report Generated   
--------------  
  
上述的例子为输出结果增加头和尾描述。

例5:Awk找出员工 ID 大于 200 的员工。

命令行:  
> gawk "$1 >200" employee.txt   
300  Sanjay  Sysadmin   Technology  $7,000  
400  Nisha   Manager    Marketing   $9,500  
500  Randy   DBA       Technology  $6,000  
  
在上述例子中,$1 代表员工 ID ,如果员工 ID 大于 200 则执行默认的打印整行的动作。

例6:Awk打印技术部员工。
$4代表员工所在的部门,如果等于 Technology 则打印出整行。

命令行:  
> gawk "$4 ~/Technology/" employee.txt   
200  Jason   Developer  Technology  $5,500  
300  Sanjay  Sysadmin   Technology  $7,000  
500  Randy   DBA      Technology  $6,000  
  
在上述例子中,~操作符是将部门字段和正则表达式中的值进行匹配,如果匹配成功则打印整行。

例7:Awk打印技术部门的员工数。
在下面的例子中,检查员工的部门是否是Technology ,如果是则递增 count 变量的值。 Count 变量的值在 BEGIN 的 Actions 中被初始化为 0 。

命令行:  
> gawk "BEGIN {count=0;} $4 ~ /Technology/ { count++; } END { print \"Number of employees in Technology Dept =\",count;}" employee.txt   
Number of employees in Tehcnology Dept = 3  
  
在处理的最后(END的Actions),仅仅打印出 Technology 部门的人数。


参考资料
GAWK 入门:AWK 语言基础
http://www.ibm.com/developerwork ... sp?cv_doc_id=172390

Awk 中变量作用域的问题
http://www.ibm.com/developerworks/cn/linux/l-cn-awkf/

通用线程: awk 实例,第1 部分
http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/

通用线程:Awk 实例,第 2部分
http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-2/

通用线程:Awk 实例,第3部分
http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-3/

了解正则表达式
http://www.ibm.com/developerworks/cn/aix/library/au-regexp/

Gawk-GNU Project-Free Software Foundation
http://www.gnu.org/software/gawk/

Gawk 用户指南
http://www.gnu.org/software/gawk/manual/gawk.html

书籍,O'Reilly 的 sed & awk, 2ndEdition是极佳选择
http://oreilly.com/catalog/sed2/

请参考 comp.lang.awkFAQ 。它还包含许多附加 awk 链接
http://www.faqs.org/faqs/computer-lang/awk/faq/

Gawk for Windows下载
http://gnuwin32.sourceforge.net/packages/gawk.htm

2010-6-22 23:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

sed文章收集
http://www.cn-dos.net/forum/viewthread.php?tid=24210
http://bbs.bathome.net/thread-1929-1-1.html

gawk文章收集
http://bbs.bathome.net/thread-3997-1-1.html



2010-6-23 12:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: