Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1683151
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: WINDOWS

2011-04-28 13:20:39

  1. 什么是awk?
  2. 可能对UNIX比较熟悉,但你可能对awk非常陌生,这一点也不奇怪,的确,和其优秀的功能相比,awk还远没达到他应有的知名度。awk是什么?和其他大
  3. 多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:他既不是具有独立意义的英文单词,也不是几个相关单词的缩写。事实上,awk是三个
  4. 人名的缩写,他们是:Aho、(Peter)Weinberg和(Brain)Kernighan。正是这三个人创造了awk---一个优秀的样式扫描和
  5. 处理工具。
  6. AWK的功能是什么?和sed和grep非常相似,awk是一种样式扫描和处理工具。但其功能却大大强于sed和grep。
  7. awk提供了极其强大的功能:他几乎能完成grep和sed所能完成的全部工作,同时,他还能能进行样式装入、流控制、数学运算符、进程控制语句甚
  8. 至于内置的变量和函数。他具有了一个完整的语言所应具有的几乎所有精美特性。实际上,awk的确拥有自己的语言:awk程式设计语言,awk的三位创建者
  9. 已将他正式定义为:样式扫描和处理语言。
  10. 为什么使用awk?
  11. 即使如此,你也许仍然会问,我为什么要使用awk?
  12. 使
  13. 用awk的第一个理由是基于文本的样式扫描和处理是我们经常做的工作,awk所做的工作有些象数据库,但和数据库不同的是,他处理的是文本文件,这些文件
  14. 没有专门的存储格式,普通的人们就能编辑、阅读、理解和处理他们。而数据库文件往往具有特别的存储格式,这使得他们必须用数据库处理程式来处理他们。既然
  15. 这种类似于数据库的处理工作我们经常会遇见,我们就应当找到处理他们的简便易行的方法,UNIX有非常多这方面的工具,例如sed
  16. 、grep、sort及find等等,awk是其中十分优秀的一种。
  17. 使用awk的第二个理由是awk是个简单的工具,当然这是相
  18. 对于其强大的功能来说的。的确,UNIX有许多优秀的工具,例如UNIX天然的研发工具C语言及其延续C++就非常的优秀。但相对于他们来说,awk完成
  19. 同样的功能要方便和简捷得多。这首先是因为awk提供了适应多种需要的解决方案:从解决简单问题的awk命令行到复杂而精巧的awk程式设计语言,这样做
  20. 的好处是,你能不必用复杂的方法去解决本来非常简单的问题。例如,你能用一个命令行解决简单的问题,而C不行,即使一个再简单的程式,C语言也必须经过
  21. 编写、编译的全过程。其次,awk本身是解释执行的,这就使得awk程式不必经过编译的过程,同时,这也使得他和shell
  22. script程式能够非常好的契合。最后,awk本身较C语言简单,虽然awk吸收了C语言非常多优秀的成分,熟悉C语言会对学习awk有非常大的帮助,但
  23. awk本身不须要会使用C语言??一种功能强大但需要大量时间学习才能掌控其技巧的研发工具。
  24. 使用awk的第三个理由是awk是个
  25. 容易获得的工具。和C和C++语言不同,awk只有一个文件(/bin/awk),而且几乎每个版本的UNIX都提供各自版本的awk,你完全不必费心去
  26. 想怎么获得awk。但C语言却不是这样,虽然C语言是UNIX天然的研发工具,但这个研发工具却是独立发行的,换言之,你必须为你的UNIX版本的C语言
  27. 研发工具独立付费(当然使用D版者除外),获得并安装他,然后你才能使用他。
  28. 基于以上理由,再加上awk强大的功能,我们有理由
  29. 说,如果你要处理和文本样式扫描相关的工作,awk应该是你的第一选择。在这里有一个可遵循的一般原则:如果你用普通的shell工具或shell
  30. script有困难的话,试试awk,如果awk仍不能解决问题,则便用C语言,如果C语言仍然失败,则移至C++。
  31. awk的调用方式
  32. 前面原来说过,awk提供了适应多种需要的不同解决方案,他们是:
  33. 一、
  34. awk命令行,你能象使用普通UNIX命令相同使用awk,在命令行中你也能使用awk程式设计语言,虽然awk支持多行的录入,不过录入长长的命令
  35. 行并确保其正确无误却是一件令人头疼的事,因此,这种方法一般只用于解决简单的问题。当然,你也能在shell
  36. script程式中引用awk命令行甚至awk程式脚本。
  37. 二、使用-f选项调用awk程式。awk允许将一段awk程式写入一个文本文件,然后在awk命令行中用-f选项调用并执行这段程式。具体的方法我们将在后面的awk语法中讲到。
  38. 三、利用命令解释器调用awk程式:利用UNIX支持的命令解释器功能,我们能将一段awk程式写入文本文件,然后在他的第一行加上:
  39. #!/bin/awk -f
  40. 并赋予这个文本文件以执行的权限。这样做之后,你就能在命令行中用类似于下面这样的方式调用并执行这段awk程式了。
  41. $awk脚本文本名 待处理文件
  42. awk的语法:
  43. 和其他UNIX命令相同,awk拥有自己的语法:
  44. awk [ -F re] [parameter...] [’prog’] [-f progfile][in_file...]
  45. 参数说明:
  46. -F re:允许awk更改其字段分隔符。
  47. parameter: 该参数帮助为不同的变量赋值。
  48. ’prog’: awk的程式语句段。这个语句段必须用单拓号:’和’括起,以防被shell解释。这个程式语句段的标准形式为:
  49. ’pattern {action}’
  50. 中pattern参数能是egrep正则表达式中的所有一个,他能使用语法/re/再加上一些样式匹配技巧构成。和sed类似,你也能使用","分
  51. 开两样式以选择某个范围。关于匹配的细节,你能参考附录,如果仍不懂的话,找本UNIX书学学grep和sed(本人是在学习ed时掌控匹配技术的)。
  52. action参数总是被大括号包围,他由一系统awk语句组成,各语句之间用";"分隔。awk解释他们,并在pattern给定的样式匹配的记录上执行
  53. 其操作。和shell类似,你也能使用“#”作为注释符,他使“#”到行尾的内容成为注释,在解释执行时,他们将被忽略。你能省略pattern和
  54. action之一,但不能两者同时省略,当省略pattern时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作??在
  55. 标准输出上显示。
  56. -f progfile:允许awk调用并执行progfile指定有程式文件。progfile是个文本文件,他必须符合awk的语法。
  57. in_file:awk的输入文件,awk允许对多个输入文件进行处理。值得注意的是awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向。
  58. awk的记录、字段和内置变量:
  59. 面说过,awk处理的工作和数据库的处理方式有相同之处,其相同处之一就是awk支持对记录和字段的处理,其中对字段的处理是grep和sed不能实现
  60. 的,这也是awk优于二者的原因之一。在awk中,缺省的情况下总是将文本文件中的一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。为了操
  61. 作这些不同的字段,awk借用shell的方法,用$1,$2,$3...这样的方式来顺序地表示行(记录)中的不同字段。特别地,awk用$0表示整个
  62. 行(记录)。不同的字段之间是用称作分隔符的字符分隔开的。系统默认的分隔符是空格。awk允许在命令行中用-F
  63. re的形式来改动这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符。awk中有好几个这样的内置变量,例如,记录分隔符变量RS、当前工
  64. 作的记录数NR等等,本文后面的附表列出了全部的内置变量。这些内置的变量能在awk程式中引用或修改,例如,你能利用NR变量在模式匹配中指定工作
  65. 范围,也能通过修改记录分隔符RS让一个特别字符而不是换行符作为记录的分隔符。
  66. 例:显示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:
  67. awk -F % ’NR==7,NR==15 {printf $1 $3 $7}’
  68. awk的内置函数
  69. awk
  70. 之所以成为一种优秀的程式设计语言的原因之一是他吸收了某些优秀的程式设计语言(例如C)语言的许多好处。这些好处之一就是内置函数的使用,awk定义并
  71. 支持了一系列的内置函数,由于这些函数的使用,使得awk提供的功能更为完善和强大,例如,awk使用了一系列的字符串处理内置函数(这些函数看起来和C
  72. 语言的字符串处理函数相似,其使用方式和C语言中的函数也相差无几),正是由于这些内置函数的使用,使awk处理字符串的功能更加强大。本文后面的附录中
  73. 列有一般的awk所提供的内置函数,这些内置函数也许和你的awk版本有些出入,因此,在使用之前,最佳参考一下你的系统中的联机帮助。
  74. 为内置函数的一个例子,我们将在这里介绍awk的printf函数,这个函数使得awk和c语言的输出相一致。实际上,awk中有许多引用形式都是从C语
  75. 言借用过来的。如果你熟悉C语言,你也许会记得其中的printf函数,他提供的强大格式输出功能原来带我们许多的方便。幸运的是,我们在awk中又和他
  76. 重逢了。awk中printf几乎和C语言中一模相同,如果你熟悉C语言的话,你完万能照C语言的模式使用awk中的printf。因此在这里,我们只
  77. 给出一个例子,如果你不熟悉的话,请随便找一本C语言的入门书翻翻。
  78. 例:显示文件myfile中的行号和第3字段:
  79. $awk ’{printf"%03d%s\n",NR,$1}’ myfile
  80. 在命令行使用awk
  81. 照顺序,我们应当讲解awk程式设计的内容了,但在讲解之前,我们将用一些例子来对前面的知识进行回顾,这些例子都是在命令行中使用的,由此我们能知道
  82. 在命令行中使用awk是多么的方便。这样做的原因一方面是为下面的内容作铺垫,另一方面是介绍一些解决简单问题的方法,我们完全没有必要用复杂的方法来解
  83. 决简单的问题----既然awk提供了较为简单的方法的话。
  84. 例:显示文本文件mydoc匹配(含有)字符串"sun"的所有行。
  85. $awk ’/sun/{print}’ mydoc
  86. 由于显示整个记录(全行)是awk的缺省动作,因此能省略action项。
  87. $awk ’/sun/’ mydoc
  88. 例:下面是个较为复杂的匹配的示例:
  89. $awk ’/[Ss]un/,/[Mm]oon/ {print}’ myfile
  90. 他将显示第一个匹配Sun或sun的行和第一个匹配Moon或moon的行之间的行,并显示到标准输出上。
  91. 例:下面的示例显示了内置变量和内置函数length()的使用:
  92. $awk ’length($0)>80 {print NR}’ myfile
  93. 该命令行将显示文本myfile中所有超过80个字符的行号,在这里,用$0表示整个记录(行),同时,内置变量NR不使用标志符’$’。
  94. 例:
  95. 作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字段(第二字
  96. 段)是否为"*",如不为"*",则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们能用如下语句实现:
  97. #awk -F: ’$2=="" {printf("%s no password!\n",$1’ /etc/passwd
  98. 在这个示例中,passwd文件的字段分隔符是“:”,因此,必须用-F:来更改默认的字段分隔符,这个示例中也涉及到了内置函数printf的使用。
  99. awk的变量
  100. 如同其他程式设计语言相同,awk允许在程式语言中设置变量,事实上,提供变量的功能是程式设计语言的其本需求,不提供变量的程式设计语言本人还从未见过。
  101. awk
  102. 提供两种变量,一种是awk内置的变量,这前面我们已讲过,需要着重指出的是,和后面提到的其他变量不同的是,在awk程式中引用内置变量不必使用标
  103. 志符"$"(回忆一下前面讲过的NR的使用)。awk提供的另一种变量是自定义变量。awk允许用户在awk程式语句中定义并调用自已的变量。当然这种变
  104. 量不能和内置变量及其他awk保留字相同,在awk中引用自定义变量必须在他前面加上标志符"$"。和C语言不同的是,awk中不必对变量进行初始化,
  105. awk根据其在awk中第一次出现的形式和上下文确定其具体的数据类型。当变量类型不确定时,awk默认其为字符串类型。这里有一个技巧:如果你要让你的
  106. awk程式知道你所使用的变量的明确类型,你应当在在程式中给他赋初值。在后面的实例中,我们将用到这一技巧。
  107. 运算和判断:
  108. 为一种程式设计语言所应具有的特点之一,awk支持多种运算,这些运算和C语言提供的几本相同:如+、-、*、/、%等等,同时,awk也支持C语言中类
  109. 似++、--、+=、-=、=+、=-之类的功能,这给熟悉C语言的使用者编写awk程式带来了极大的方便。作为对运算功能的一种扩展,awk还提供了一
  110. 系列内置的运算函数(如log、sqr、cos、sin等等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数
  111. 的引用大大的提高了awk的运算功能。
  112. 作为对条件转移指令的一部分,关系判断是每种程式设计语言都具有的功能,awk也不例外。
  113. awk中允许进行多种测试,如常用的==(等于)、!=(不等于)、>(大于)、=(大于等于)、>=(小于等
  114. 于)等等,同时,作为样式匹配,还提供了~(匹配于)和!~(不匹配于)判断。
  115. 作为对测试的一种扩充,awk也支持用逻辑运算符:!(非)、&&(和)、||(或)和括号()进行多重判断,这大大增强了awk的功能。本文的附录中列出了awk所允许的运算、判断及操作符的优先级。
  116. awk的流程控制
  117. 流程控制语句是所有程式设计语言都不能缺少的部分。所有好的语言都有一些执行流程控制的语句。awk提供的完备的流程控制语句类似于C语言,这给我们编程带来了极大的方便。
  118. 1、BEGIN和END:
  119. 在awk
  120. 中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程式赋予初始状态
  121. 和在程式结束之后执行一些扫尾的工作。所有在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全
  122. 部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
  123. 例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):
  124. $awk
  125. >’BEGIN { FS=":";print "统计销售金额";total=0}
  126. >{print $3;total=total+$3;}
  127. >END {printf "销售金额总计:%.2f",total}’ sx
  128. (注:>是shell提供的第二提示符,如要在shell程式awk语句和awk语言中换行,则需在行尾加反斜杠\)
  129. 在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。
  130. 2、流程控制语句
  131. awk提供了完备的流程控制语句,其用法和C语言类似。下面我们一一加以说明:
  132. 2.1、if...else语句:
  133. 格式:
  134. if(表达式)
  135. 语句1
  136. else
  137. 语句2
  138. 格式中"语句1"能是多个语句,如果你为了方便awk判断也方便你自已阅读,你最佳将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为:
  139. if(表达式1)
  140. {if(表达式2)
  141. 语句1
  142. else
  143. 语句2
  144. }
  145. 语句3
  146. else {if(表达式3)
  147. 语句4
  148. else
  149. 语句5
  150. }
  151. 语句6
  152. 当然实际操作过程中你可能不会用到如此复杂的分枝结构,这里只是为了给出其样式罢了。
  153. 2.2、while语句
  154. 格式为:
  155. while(表达式)
  156. 语句
  157. 2.3、do-while语句
  158. 格式为:
  159. do
  160. {
  161. 语句
  162. }while(条件判断语句)
  163. 2.4、for语句
  164. 格式为:
  165. for(初始表达式;终止条件;步长表达式)
  166. {语句}
  167. 在awk
  168. while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break
  169. 中断当前正在执行的循环并跳到循环外执行下一条语句。continue从当前位置跳到循环开始处执行。对于exit的执行有两种情况:当exit语句不在
  170. END中时,所有操作中的exit命令表现得如同到了文件尾,所有模式或操作执行将停止,END模式中的操作被执行。而出目前END中的exit将导致程
  171. 序终止。
  172. 例:为了
  173. awk中的自定义函数
  174. 定义和调用用户自己的函数是几乎每个高级语言都具有的功能,awk也不例外,但原始的awk并不提供函数功能,只有在nawk或较新的awk版本中才能增加函数。
  175. 函数的使用包含两部分:函数的定义和函数调用。其中函数定义又包括要执行的代码(函数本身)和从主程式代码传递到该函数的临时调用。
  176. awk函数的定义方法如下:
  177. function 函数名(参数表){
  178. 函数体
  179. }
  180. 在gawk中允许将function省略为func,但其他版本的awk不允许。函数名必须是个合法的标志符,参数表中能不提供参数(但在调用函数时函数名后的一对括号仍然是不可缺少的),也能提供一个或多个参数。和C语言相似,awk的参数也是通过值来传递的。
  181. 在awk
  182. 中调用函数比较简单,其方法和C语言相似,但awk比C语言更为灵活,他不执行参数有效性检查。换句话说,在你调用函数时,能列出比函数预计(函数定义
  183. 中规定)的多或少的参数,多余的参数会被awk所忽略,而不足的参数,awk将他们置为缺省值0或空字符串,具体置为何值,将取决于参数的使用方式。
  184. awk函数有两种返回方式:隐式返回和显式返回。当awk执行到函数的结尾时,他自动地返回到调用程式,这是函数是隐式返回的。如果需要在结束之前退出函数,能明确地使用返回语句提前退出。方法是在函数中使用形如:return 返回值 格式的语句。
  185. 例:
  186. 下面的例子演示了函数的使用。在这个示例中,定义了一个名为print_header的函数,该函数调用了两个参数FileName和PageNum,
  187. FileName参数传给函数当前使用的文件名,PageNum参数是当前页的页号。这个函数的功能是打印(显示)出当前文件的文件名,和当前页的页号。
  188. 完成这个功能后,这个函数将返回下一页的页号。
  189. nawk
  190. >’BEGIN{pageno=1;file=FILENAME
  191. >pageno=print_header(file,pageno);#调用函数print_header
  192. >printf("当前页页号是:%d\n",pageno);
  193. >}
  194. >#定义函数print_header
  195. >function print_header(FileName,PageNum){
  196. >printf("%s %d\n",FileName,PageNum); >PageNum++;return PageNUm;
  197. >}
  198. >}’ myfile
  199. 执行这个程式将显示如下内容:
  200. myfile 1
  201. 当前页页号是:2
  202. awk高级输入输出
  203. 1.读取下一条记录:
  204. awk的next语句导致awk读取下一个记录并完成模式匹配,然后即时执行相应的操作。通常他用匹配的模式执行操作中的代码。next导致这个记录的所有额外匹配模式被忽略。
  205. 2.简单地读取一条记录
  206. awk
  207. getline语句用于简单地读取一条记录。如果用户有一个数据记录类似两个物理记录,那么getline将尤其有用。他完成一般字段的分离(设置字段变
  208. 量$0 FNR NF NR)。如果成功则返回1,失败则返回0(到达文件尾)。如果需简单地读取一个文件,则能编写以下代码:
  209. 例:示例getline的使用
  210. {while(getline==1)
  211. {
  212. #process the inputted fields
  213. }
  214. }
  215. 也能使getline保存输入数据在一个字段中,而不是通过使用getline variable的形式处理一般字段。当使用这种方式时,NF被置成0,FNR和NR被增值。
  216. 户也能使用getline"datafile"
  217. printf("hello word!\n")>>"datafile"
  218. 5.输出到一个命令
  219. awk中允许用如下方式将结果输出到一个命令:
  220. printf("hello word!\n")|"sort-t’,’"
  221. awk和shell script混合编程
  222. 为awk能作为一个shell命令使用,因此awk能和shell批处理程式非常好的融合在一起,这给实现awk和shell程式的混合编程提供了可能。
  223. 实现混合编程的关键是awk和shell script之间的对话,换言之,就是awk和shell script之间的信息交流:awk从shell
  224. script中获取所需的信息(通常是变量的值)、在awk中执行shell命令行、shell
  225. script将命令执行的结果送给awk处理及shell script读取awk的执行结果等等。
  226. 1.awk读取Shell script程式变量
  227. 在awk中我们能通过“’$变量名’”的方式读取sell scrpit程式中的变量。
  228. 例:在下面的示例中,我们将读取sell scrpit程式中的变量Name,该变量存放的是文本myfile的撰写者,awk将打印出这个人名。
  229. $cat writename
  230. :
  231. # @(#)
  232. #
  233. .
  234. .
  235. .
  236. Name="张三" nawk ’BEGIN {name="’Name’";\ printf("\t%s\t撰写者%s\n",FILENAME,name");}\
  237. {...}END{...}’ myfile
  238. .
  239. .
  240. .
  241. 2.将shell命令的执行结果送给awk处理
  242. 作为信息传送的一种方法,我们能将一条shell命令的结果通过管道线(|)传递给awk处理:
  243. 例:示例awk处理shell命令的执行结果
  244. $who -u | awk ’{printf("%s正在执行%s\n",$2,$1)}’
  245. 该命令将打印出注册终端正在执行的程式名。
  246. 3.shell script程式读awk的执行结果
  247. 了实现shell
  248. script程式读取awk执行的结果,我们能采取一些特别的方法,例如我们能用变量名=`awk语句`的形式将awk执行的结果存放入一个
  249. shell script变量。当然也能用管道线的方法将awk执行结果传递给shell script程式处理。
  250. 例:作为传送消
  251. 息的机制之一,UNIX提供了一个向其所有用户传送消息的命令wall(意思是write to
  252. all写给所有用户),该命令允许向所有工作中的用户(终端)发送消息。为此,我们能通过一段shell批处理程式wall.shell来模拟这一程式
  253. (事实上比较老的版本中wall就是一段shell批处理程式:
  254. $cat wall.shell
  255. :
  256. # @(#) wall.shell:发送消息给每个已注册终端
  257. #
  258. cat >/tmp/$$
  259. #用户录入消息文本 who -u | awk ’{print $2}’ | while read tty
  260. do
  261. cat /tmp/$$>$tty
  262. done
  263. 这个程式里,awk接受who
  264. -u命令的执行结果,该命令打印出所有已注册终端的信息,其中第二个字段是已注册终端的设备名,因此用awk命令析出该设备名,然后用while
  265. read tty语句循环读出这些文件名到变量(shell script变量)tty中,作为信息传送的终结地址。
  266. 4.在awk中执行shell命令行----嵌入函数system()
  267. system()是个不适合字符或数字类型的嵌入函数,该函数的功能是处理作为参数传递给他的字符串。system对这个参数的处理就是将其作为命令处理,也就是说将其当作命令行相同加以执行。这使得用户在自己的awk程式需要时能灵活地执行命令或脚本。
  268. 例:下面的程式将使用system嵌入函数打印用户编制好的报表文件,这个文件存放在名为myreport.txt的文件中。为简约起见,我们只列出了其END部分:
  269. .
  270. .
  271. .
  272. END {close("myreport.txt");system("lp myreport.txt");}
  273. 在这个示例中,我们首先使用close语句关闭了文件myreport.txt文件,然后使用system嵌入函数将myreport.txt送入打印机打印。
  274. 到这里,我不得不跟朋友们说再见了,实在地说,这些内容仍然是awk的初步知识,计算机永远是前进的科学,awk也不例外,本篇所能做的只是在你前行的漫漫
  275. 长途中铺平一段小小开端,剩下的路还得靠你自己去走。老实说,如果本文真能给你前行的路上带来些许的方便,那本人就知足了!
  276. 如对本篇有所有疑问,请E-mail To:Chizlong@yeah.net或到主页中留言。
  277. 附录:
  278. 1.awk的常规表达式元字符
  279. \ 换码序列
  280. ^ 在字符串的开头开始匹配
  281. $ 在字符串的结尾开始匹配
  282. . 和所有单个字符串匹配
  283. [ABC] 和[]内的任一字符匹配
  284. [A-Ca-c] 和A-C及a-c范围内的字符匹配(按字母表顺序)
  285. [^ABC] 和除[]内的所有字符以外的任一字符匹配
  286. Desk|Chair 和Desk和Chair中的任一个匹配
  287. [ABC][DEF] 关联。和A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。
  288. * 和A、B或C中任一个出现0次或多次的字符相匹配
  289. + 和A、B或C中所有一个出现1次或多次的字符相匹配
  290. ? 和一个空串或A、B或C在所有一个字符相匹配
  291. (Blue|Black)berry 合并常规表达式,和Blueberry或Blackberry相匹配
  292. 2.awk算术运算符
  293. 运算符 用途
  294. ------------------
  295. x^y x的y次幂
  296. x**y 同上
  297. x%y 计算x/y的余数(求模)
  298. x+y x加y
  299. x-y x减y
  300. x*y x乘y
  301. x/y x除y
  302. -y 负y(y的开关符号);也称一目减
  303. ++y y加1后使用y(前置加)
  304. y++ 使用y值后加1(后缀加)
  305. --y y减1后使用y(前置减)
  306. y-- 使用后y减1(后缀减)
  307. x=y 将y的值赋给x
  308. x+=y 将x+y的值赋给x
  309. x-=y 将x-y的值赋给x
  310. x*=y 将x*y的值赋给x
  311. x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
  312. x^=y 将x^y的值赋给x
  313. x**=y 将x**y的值赋给x
  314. 3.awk允许的测试:
  315. 操作符 含义
  316. x==y x等于y
  317. x!=y x不等于y
  318. x>y x大于y
  319. x>=y x大于或等于y
  320. x >= < <= == != ~ !~
  321. xy (字符串连结,’x’’y’变成"xy")
  322. + -
  323. * / %
  324. ++ --
  325. 5.awk内置变量(预定义变量)
  326. 说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawk
  327. V 变量 含义 缺省值
  328. --------------------------------------------------------
  329. N ARGC 命令行参数个数
  330. G ARGIND 当前被处理文件的ARGV标志符
  331. N ARGV 命令行参数数组
  332. G CONVFMT 数字转换格式 %.6g
  333. P ENVIRON UNIX环境变量
  334. N ERRNO UNIX系统错误消息
  335. G FIELDWIDTHS 输入字段宽度的空白分隔字符串
  336. A FILENAME 当前输入文件的名字
  337. P FNR 当前记录数
  338. A FS 输入字段分隔符 空格
  339. G IGNORECASE 控制大小写敏感0(大小写敏感)
  340. A NF 当前记录中的字段个数
  341. A NR 已读出的记录数
  342. A OFMT 数字的输出格式 %.6g
  343. A OFS 输出字段分隔符 空格
  344. A ORS 输出的记录分隔符 新行
  345. A RS 输入的记录他隔符 新行
  346. N RSTART 被匹配函数匹配的字符串首
  347. N RLENGTH 被匹配函数匹配的字符串长度
  348. N SUBSEP 下标分隔符 "\034"
  349. 6.awk的内置函数
  350. V 函数 用途或返回值
  351. ------------------------------------------------
  352. N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
  353. N index(search,string) 返回string中search串的位置
  354. A length(string) 求串string中的字符个数
  355. N match(string,reg) 返回常规表达式reg匹配的string中的位置
  356. N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
  357. N split(string,store,delim) 根据分界符delim,分解string为store的数组元素
  358. N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据
  359. G strftime(format,timestamp) 返回一个基于format的日期或时间串,timestmp是systime()函数返回的时间
  360. N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
  361. A substr(string,position,len) 返回一个以position开始len个字符的子串
  362. P totower(string) 返回string中对应的小写字符
  363. P toupper(string) 返回string中对应的大写字符
  364. A atan(x,y) x的余切(弧度)
  365. N cos(x) x的余弦(弧度)
  366. A exp(x) e的x幂
  367. A int(x) x的整数部分
  368. A log(x) x的自然对数值
  369. N rand() 0-1之间的随机数
  370. N sin(x) x的正弦(弧度)
  371. A sqrt(x) x的平方根
  372. A srand(x) 初始化随机数发生器。如果忽略x,则使用system()
  373. G system() 返回自1970年1月1日以来经过的时间(按秒计算)
阅读(962) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~