什么是awk? 你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什 么?与其它大多数UNIX命令不一样的是,从名字上看,咱们不可能知道awk的功能:它既不是具备独立意义的英文单词,也不是几个相关单词的缩写。事实 上,awk是三我的名的缩写,他们是:Aho、(Peter)Weinberg和(Brain)Kernighan。正是这三我的创造了awk---一个 优秀的样式扫描与处理工具。 AWK的功能是什么?与sed和grep很类似,awk是一种样式扫描与处理工具。但其功能却大大强于sed和grep。awk提供了极其强大的 功能:它几乎能够完成grep和sed所能完成的所有工做,同时,它还能够能够进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。 它具有了一个完整的语言所应具备的几乎全部精美特性。实际上,awk的确拥有本身的语言:awk程序设计语言,awk的三位建立者已将它正式定义为:样式 扫描和处理语言。 为何使用awk? 即便如此,你也许仍然会问,我为何要使用awk? 使用awk的第一个理由是基于文本的样式扫描和处理是咱们常常作的工做,awk所作的工做有些象数据库,但与数据库不一样的是,它处理的是文本文 件,这些文件没有专门的存储格式,普通的人们就能编辑、阅读、理解和处理它们。而数据库文件每每具备特殊的存储格式,这使得它们必须用数据库处理程序来处 理它们。既然这种相似于数据库的处理工做咱们常常会遇到,咱们就应当找处处理它们的简便易行的方法,UNIX有不少这方面的工具,例如sed 、grep、sort以及find等等,awk是其中十分优秀的一种。 使用awk的第二个理由是awk是一个简单的工具,固然这是相对于其强大的功能来讲的。的确,UNIX有许多优秀的工具,例如UNIX自然的开发 工具C语言及其延续C++就很是的优秀。但相对于它们来讲,awk完成一样的功能要方便和简捷得多。这首先是由于awk提供了适应多种须要的解决方案:从 解决简单问题的awk命令行到复杂而精巧的awk程序设计语言,这样作的好处是,你能够没必要用复杂的方法去解决原本很简单的问题。例如,你能够用一个命令 行解决简单的问题,而C不行,即便一个再简单的程序,C语言也必须通过编写、编译的全过程。其次,awk自己是解释执行的,这就使得awk程序没必要通过编 译的过程,同时,这也使得它与shell script程序可以很好的契合。最后,awk自己较C语言简单,虽然awk吸取了C语言不少优秀的成分,熟悉C语言会对学习awk有很大的帮助,但 awk自己不需要会使用C语言――一种功能强大但须要大量时间学习才能掌握其技巧的开发工具。 使用awk的第三个理由是awk是一个容易得到的工具。与C和C++语言不一样,awk只有一个文件(/bin/awk),并且几乎每一个版本的 UNIX都提供各自版本的awk,你彻底没必要费心去想如何得到awk。但C语言却不是这样,虽然C语言是UNIX自然的开发工具,但这个开发工具倒是单独 发行的,换言之,你必须为你的UNIX版本的C语言开发工具单独付费(固然使用D版者除外),得到并安装它,而后你才可使用它。 基于以上理由,再加上awk强大的功能,咱们有理由说,若是你要处理与文本样式扫描相关的工做,awk应该是你的第一选择。在这里有一个可遵循的 通常原则:若是你用普通的shell工具或shell script有困难的话,试试awk,若是awk仍不能解决问题,则便用C语言,若是C语言仍然失败,则移至C++。 awk的调用方式 前面曾经说过,awk提供了适应多种须要的不一样解决方案,它们是: 1、awk命令行,你能够象使用普通UNIX命令同样使用awk,在命令行中你也可使用awk程序设计语言,虽然awk支持多行的录入,可是录 入长长的命令行并保证其正确无误倒是一件使人头疼的事,所以,这种方法通常只用于解决简单的问题。固然,你也能够在shell script程序中引用awk命令行甚至awk程序脚本。 2、使用-f选项调用awk程序。awk容许将一段awk程序写入一个文本文件,而后在awk命令行中用-f选项调用并执行这段程序。具体的方法咱们将在后面的awk语法中讲到。 3、利用命令解释器调用awk程序:利用UNIX支持的命令解释器功能,咱们能够将一段awk程序写入文本文件,而后在它的第一行加上: #!/bin/awk -f 并赋予这个文本文件以执行的权限。这样作以后,你就能够在命令行中用相似于下面这样的方式调用并执行这段awk程序了。 $awk脚本文本名 待处理文件 awk的语法: 与其它UNIX命令同样,awk拥有本身的语法: awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...] 参数说明: -F re:容许awk更改其字段分隔符。 parameter: 该参数帮助为不一样的变量赋值。 'prog': awk的程序语句段。这个语句段必须用单拓号:'和'括起,以防被shell解释。这个程序语句段的标准形式为: 'pattern {action}' 其中pattern参数能够是egrep正则表达式中的任何一个,它可使用语法/re/再加上一些样式匹配技巧构成。与sed相似,你也可使 用","分开两样式以选择某个范围。关于匹配的细节,你能够参考附录,若是仍不懂的话,找本UNIX书学学grep和sed(本人是在学习ed时掌握匹配 技术的)。action参数老是被大括号包围,它由一系统awk语句组成,各语句之间用";"分隔。awk解释它们,并在pattern给定的样式匹配的 记录上执行其操做。与shell相似,你也可使用“#”做为注释符,它使“#”到行尾的内容成为注释,在解释执行时,它们将被忽略。你能够省略 pattern和action之一,但不能二者同时省略,当省略pattern时没有样式匹配,表示对全部行(记录)均执行操做,省略action时执行 缺省的操做――在标准输出上显示。 -f progfile:容许awk调用并执行progfile指定有程序文件。progfile是一个文本文件,他必须符合awk的语法。 in_file:awk的输入文件,awk容许对多个输入文件进行处理。值得注意的是awk不修改输入文件。若是未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向。 awk的记录、字段与内置变量: 前面说过,awk处理的工做与数据库的处理方式有相同之处,其相同处之一就是awk支持对记录和字段的处理,其中对字段的处理是grep和sed 不能实现的,这也是awk优于两者的缘由之一。在awk中,缺省的状况下老是将文本文件中的一行视为一个记录,而将一行中的某一部分做为记录中的一个字 段。为了操做这些不一样的字段,awk借用shell的方法,用$1,$2,$3...这样的方式来顺序地表示行(记录)中的不一样字段。特殊地,awk 用$0表示整个行(记录)。不一样的字段之间是用称做分隔符的字符分隔开的。系统默认的分隔符是空格。awk容许在命令行中用-F re的形式来改变这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符。awk中有好几个这样的内置变量,例如,记录分隔符变量RS、当前工 做的记录数NR等等,本文后面的附表列出了所有的内置变量。这些内置的变量能够在awk程序中引用或修改,例如,你能够利用NR变量在模式匹配中指定工做 范围,也能够经过修改记录分隔符RS让一个特殊字符而不是换行符做为记录的分隔符。 例:显示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段: awk -F % 'NR==7,NR==15 {printf $1 $3 $7}' awk的内置函数 awk之因此成为一种优秀的程序设计语言的缘由之一是它吸取了某些优秀的程序设计语言(例如C)语言的许多优势。这些优势之一就是内置函数的使 用,awk定义并支持了一系列的内置函数,因为这些函数的使用,使得awk提供的功能更为完善和强大,例如,awk使用了一系列的字符串处理内置函数(这 些函数看起来与C语言的字符串处理函数类似,其使用方式与C语言中的函数也相差无几),正是因为这些内置函数的使用,使awk处理字符串的功能更增强大。 本文后面的附录中列有通常的awk所提供的内置函数,这些内置函数也许与你的awk版本有些出入,所以,在使用以前,最好参考一下你的系统中的联机帮助。 做为内置函数的一个例子,咱们将在这里介绍awk的printf函数,这个函数使得awk与c语言的输出相一致。实际上,awk中有许多引用形式 都是从C语言借用过来的。若是你熟悉C语言,你也许会记得其中的printf函数,它提供的强大格式输出功能曾经带咱们许多的方便。幸运的是,咱们在 awk中又和它重逢了。awk中printf几乎与C语言中如出一辙,若是你熟悉C语言的话,你彻底能够照C语言的模式使用awk中的printf。所以 在这里,咱们只给出一个例子,若是你不熟悉的话,请随便找一本C语言的入门书翻翻。 例:显示文件myfile中的行号和第3字段: $awk '{printf"%03d%s",NR,$1}' myfile 在命令行使用awk 按照顺序,咱们应当讲解awk程序设计的内容了,但在讲解以前,咱们将用一些例子来对前面的知识进行回顾,这些例子都是在命令行中使用的,由此我 们能够知道在命令行中使用awk是多么的方便。这样作的缘由一方面是为下面的内容做铺垫,另外一方面是介绍一些解决简单问题的方法,咱们彻底没有必要用复杂 的方法来解决简单的问题----既然awk提供了较为简单的方法的话。 例:显示文本文件mydoc匹配(含有)字符串"sun"的全部行。 $awk '/sun/{print}' mydoc 因为显示整个记录(全行)是awk的缺省动做,所以能够省略action项。 $awk '/sun/' mydoc 例:下面是一个较为复杂的匹配的示例: $awk '/[Ss]un/,/[Mm]oon/ {print}' myfile 它将显示第一个匹配Sun或sun的行与第一个匹配Moon或moon的行之间的行,并显示到标准输出上。 例:下面的示例显示了内置变量和内置函数length()的使用: $awk 'length($0)>80 {print NR}' myfile 该命令行将显示文本myfile中全部超过80个字符的行号,在这里,用$0表示整个记录(行),同时,内置变量NR不使用标志符'$'。 例:做为一个较为实际的例子,咱们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字 段(第二字段)是否为"*",如不为"*",则表示该用户没有设置密码,显示出这些用户名(第一字段)。咱们能够用以下语句实现: #awk -F: '$2=="" {printf("%s no password!",$1' /etc/passwd 在这个示例中,passwd文件的字段分隔符是“:”,所以,必须用-F:来更改默认的字段分隔符,这个示例中也涉及到了内置函数printf的使用。 awk的变量 如同其它程序设计语言同样,awk容许在程序语言中设置变量,事实上,提供变量的功能是程序设计语言的其本要求,不提供变量的程序设计语言本人还从未见过。 awk提供两种变量,一种是awk内置的变量,这前面咱们已经讲过,须要着重指出的是,与后面提到的其它变量不一样的是,在awk程序中引用内置变 量不须要使用标志符"$"(回忆一下前面讲过的NR的使用)。awk提供的另外一种变量是自定义变量。awk容许用户在awk程序语句中定义并调用自已的变 量。固然这种变量不能与内置变量及其它awk保留字相同,在awk中引用自定义变量必须在它前面加上标志符"$"。与C语言不一样的是,awk中不须要对变 量进行初始化,awk根据其在awk中第一次出现的形式和上下文肯定其具体的数据类型。当变量类型不肯定时,awk默认其为字符串类型。这里有一个技巧: 若是你要让你的awk程序知道你所使用的变量的明确类型,你应当在在程序中给它赋初值。在后面的实例中,咱们将用到这一技巧。 运算与判断: 做为一种程序设计语言所应具备的特色之一,awk支持多种运算,这些运算与C语言提供的几本相同:如+、-、*、/、%等等,同时,awk也支持 C语言中相似++、--、+=、-=、=+、=-之类的功能,这给熟悉C语言的使用者编写awk程序带来了极大的方便。做为对运算功能的一种扩展,awk 还提供了一系列内置的运算函数(如log、sqr、cos、sin等等)和一些用于对字符串进行操做(运算)的函数(如length、substr等 等)。这些函数的引用大大的提升了awk的运算功能。 做为对条件转移指令的一部分,关系判断是每种程序设计语言都具有的功能,awk也不例外。awk中容许进行多种测试,如经常使用的==(等于)、!= (不等于)、>(大于)、<(小于)、>=(大于等于)、>=(小于等于)等等,同时,做为样式匹配,还提供了~(匹配于) 和!~(不匹配于)判断。 做为对测试的一种扩充,awk也支持用逻辑运算符:!(非)、&&(与)、||(或)和括号()进行多重判断,这大大加强了awk的功能。本文的附录中列出了awk所容许的运算、判断以及操做符的优先级。 awk的流程控制 流程控制语句是任何程序设计语言都不能缺乏的部分。任何好的语言都有一些执行流程控制的语句。awk提供的完备的流程控制语句相似于C语言,这给咱们编程带来了极大的方便。 一、BEGIN和END: 在awk中两个特别的表达式,BEGIN和END,这二者均可用于pattern中(参考前面的awk语法),提供BEGIN和END的做用是给 程序赋予初始状态和在程序结束以后执行一些扫尾的工做。任何在BEGIN以后列出的操做(在{}内)将在awk开始扫描输入以前执行,而END以后列出的 操做将在扫描彻底部的输入以后执行。所以,一般使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。 例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段): $awk >'BEGIN { FS=":";print "统计销售金额";total=0} >{print $3;total=total+$3;} >END {printf "销售金额总计:%.2f",total}' sx (注:>是shell提供的第二提示符,如要在shell程序awk语句和awk语言中换行,则需在行尾加反斜杠) 在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描以前显示出输出行头。而END则在扫描完成后打印出总合计。 二、流程控制语句 awk提供了完备的流程控制语句,其用法与C语言相似。下面咱们一一加以说明: 2.一、if...else语句: 格式: if(表达式) 语句1 else 语句2 格式中"语句1"能够是多个语句,若是你为了方便awk判断也方便你自已阅读,你最好将多个语句用{}括起来。awk分枝结构容许嵌套,其格式为: if(表达式1) {if(表达式2) 语句1 else 语句2 } 语句3 else {if(表达式3) 语句4 else 语句5 } 语句6 固然实际操做过程当中你可能不会用到如此复杂的分枝结构,这里只是为了给出其样式罢了。 2.二、while语句 格式为: while(表达式) 语句 2.三、do-while语句 格式为: do { 语句 }while(条件判断语句) 2.四、for语句 格式为: for(初始表达式;终止条件;步长表达式) {语句} 在awk的 while、do-while和for语句中容许使用break,continue语句来控制流程走向,也容许使用exit这样的语句来退出。break 中断当前正在执行的循环并跳到循环外执行下一条语句。continue从当前位置跳到循环开始处执行。对于exit的执行有两种状况:当exit语句不在 END中时,任何操做中的exit命令表现得如同到了文件尾,全部模式或操做执行将中止,END模式中的操做被执行。而出如今END中的exit将致使程 序终止。 例:为了 awk中的自定义函数 定义和调用用户本身的函数是几乎每一个高级语言都具备的功能,awk也不例外,但原始的awk并不提供函数功能,只有在nawk或较新的awk版本中才能够增长函数。 函数的使用包含两部分:函数的定义与函数调用。其中函数定义又包括要执行的代码(函数自己)和从主程序代码传递到该函数的临时调用。 awk函数的定义方法以下: function 函数名(参数表){ 函数体 } 在gawk中容许将function省略为func,但其它版本的awk不容许。函数名必须是一个合法的标志符,参数表中能够不提供参数(但在调用函数时函数名后的一对括号仍然是不可缺乏的),也能够提供一个或多个参数。与C语言类似,awk的参数也是经过值来传递的。 在awk中调用函数比较简单,其方法与C语言类似,但awk比C语言更为灵活,它不执行参数有效性检查。换句话说,在你调用函数时,能够列出比函 数预计(函数定义中规定)的多或少的参数,多余的参数会被awk所忽略,而不足的参数,awk将它们置为缺省值0或空字符串,具体置为什么值,将取决于参数 的使用方式。 awk函数有两种返回方式:隐式返回和显式返回。当awk执行到函数的结尾时,它自动地返回到调用程序,这是函数是隐式返回的。若是须要在结束以前退出函数,能够明确地使用返回语句提早退出。方法是在函数中使用形如:return 返回值 格式的语句。 例:下面的例子演示了函数的使用。在这个示例中,定义了一个名为print_header的函数,该函数调用了两个参数FileName和 PageNum,FileName参数传给函数当前使用的文件名,PageNum参数是当前页的页号。这个函数的功能是打印(显示)出当前文件的文件名, 和当前页的页号。完成这个功能后,这个函数将返回下一页的页号。 nawk >'BEGIN{pageno=1;file=FILENAME >pageno=print_header(file,pageno);#调用函数print_header >printf("当前页页号是:%d",pageno); >} >#定义函数print_header >function print_header(FileName,PageNum){ >printf("%s %d",FileName,PageNum); >PageNum++;return PageNUm; >} >}' myfile 执行这个程序将显示以下内容: myfile 1 当前页页号是:2 awk高级输入输出 1.读取下一条记录: awk的next语句致使awk读取下一个记录并完成模式匹配,而后当即执行相应的操做。一般它用匹配的模式执行操做中的代码。next致使这个记录的任何额外匹配模式被忽略。 2.简单地读取一条记录 awk的 getline语句用于简单地读取一条记录。若是用户有一个数据记录相似两个物理记录,那么getline将尤为有用。它完成通常字段的分离(设置字段变 量$0 FNR NF NR)。若是成功则返回1,失败则返回0(到达文件尾)。若是需简单地读取一个文件,则能够编写如下代码: 例:示例getline的使用 {while(getline==1) { #process the inputted fields } } 也可使getline保存输入数据在一个字段中,而不是经过使用getline variable的形式处理通常字段。当使用这种方式时,NF被置成0,FNR和NR被增值。 用户也可使用getline<"filename"方式从一个给定的文件中输入数据,而不是从命令行所列内容输入数据。此 时,getline将完成通常字段分离(设置字段变量$0和NF)。若是文件不存在,返回-1,成功,返回1,返回0表示失败。用户能够从给定文件中读取 数据到一个变量中,也能够用stdin(标准输入设备)或一个包含这个文件名的变量代替filename。值得注意的是当使用这种方式时不修改FNR和 NR。 另外一种使用getline语句的方法是从UNIX命令接受输入,例以下面的例子: 例:示例从UNIX命令接受输入 {while("who -u"|getline) { #process each line from the who command } } 固然,也可使用以下形式: "command" | getline variable 3.关闭文件: awk中容许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。 close("filename") filename能够是getline打开的文件(也能够是stdin,包含文件名的变量或者getline使用的确切命令)。或一个输出文件(能够是stdout,包含文件名的变量或使用管道的确切命令)。 4.输出到一个文件: awk中容许用以下方式将结果输出到一个文件: printf("hello word!")>"datafile" 或 printf("hello word!")>>"datafile" 5.输出到一个命令 awk中容许用以下方式将结果输出到一个命令: printf("hello word!")|"sort-t','" awk与shell script混合编程 由于awk能够做为一个shell命令使用,所以awk能与shell批处理程序很好的融合在一块儿,这给实现awk与shell程序的混合编程提 供了可能。实现混合编程的关键是awk与shell script之间的对话,换言之,就是awk与shell script之间的信息交流:awk从shell script中获取所需的信息(一般是变量的值)、在awk中执行shell命令行、shell script将命令执行的结果送给awk处理以及shell script读取awk的执行结果等等。 1.awk读取Shell script程序变量 在awk中咱们能够经过“'$变量名'”的方式读取sell scrpit程序中的变量。 例:在下面的示例中,咱们将读取sell scrpit程序中的变量Name,该变量存放的是文本myfile的撰写者,awk将打印出这我的名。 $cat writename : # @(#) # . . . Name="张三" nawk 'BEGIN {name="'Name'"; printf("%s撰写者%s",FILENAME,name");} {...}END{...}' myfile . . . 2.将shell命令的执行结果送给awk处理 做为信息传送的一种方法,咱们能够将一条shell命令的结果经过管道线(|)传递给awk处理: 例:示例awk处理shell命令的执行结果 $who -u | awk '{printf("%s正在执行%s",$2,$1)}' 该命令将打印出注册终端正在执行的程序名。 3.shell script程序读awk的执行结果 为了实现shell script程序读取awk执行的结果,咱们能够采起一些特殊的方法,例如咱们能够用变量名=`awk语句`的形式将awk执行的结果存放入一个 shell script变量。固然也能够用管道线的方法将awk执行结果传递给shell script程序处理。 例:做为传送消息的机制之一,UNIX提供了一个向其全部用户传送消息的命令wall(意思是write to all写给全部用户),该命令容许向全部工做中的用户(终端)发送消息。为此,咱们能够经过一段shell批处理程序wall.shell来模拟这一程序 (事实上比较老的版本中wall就是一段shell批处理程序: $cat wall.shell : # @(#) wall.shell:发送消息给每一个已注册终端 # cat >/tmp/$$ #用户录入消息文本 who -u | awk '{print $2}' | while read tty do cat /tmp/$$>$tty done 在这个程序里,awk接受who -u命令的执行结果,该命令打印出全部已注册终端的信息,其中第二个字段是已注册终端的设备名,所以用awk命令析出该设备名,而后用while read tty语句循环读出这些文件名到变量(shell script变量)tty中,做为信息传送的终结地址。 4.在awk中执行shell命令行----嵌入函数system() system()是一个不适合字符或数字类型的嵌入函数,该函数的功能是处理做为参数传递给它的字符串。system对这个参数的处理就是将其做为命令处理,也就是说将其看成命令行同样加以执行。这使得用户在本身的awk程序须要时能够灵活地执行命令或脚本。 例:下面的程序将使用system嵌入函数打印用户编制好的报表文件,这个文件存放在名为myreport.txt的文件中。为简约起见,咱们只列出了其END部分: . . . END {close("myreport.txt");system("lp myreport.txt");} 在这个示例中,咱们首先使用close语句关闭了文件myreport.txt文件,而后使用system嵌入函数将myreport.txt送入打印机打印。 写到这里,我不得不跟朋友们说再见了,实在地说,这些内容仍然是awk的初步知识,电脑永远是前进的科学,awk也不例外,本篇所能作的只是在你 前行的漫漫长途中铺平一段小小开端,剩下的路还得靠你本身去走。老实说,若是本文真能给你前行的路上带来些许的方便,那本人就满足了! 如对本篇有任何疑问,请E-mail To:Chizlong@yeah.net或到主页http://chizling.yeah.net中留言。 附录: 1.awk的常规表达式元字符 换码序列 ^ 在字符串的开头开始匹配 $ 在字符串的结尾开始匹配 . 与任何单个字符串匹配 [ABC] 与[]内的任一字符匹配 [A-Ca-c] 与A-C及a-c范围内的字符匹配(按字母表顺序) [^ABC] 与除[]内的全部字符之外的任一字符匹配 Desk|Chair 与Desk和Chair中的任一个匹配 [ABC][DEF] 关联。与A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。 * 与A、B或C中任一个出现0次或屡次的字符相匹配 + 与A、B或C中任何一个出现1次或屡次的字符相匹配 ? 与一个空串或A、B或C在任何一个字符相匹配 (Blue|Black)berry 合并常规表达式,与Blueberry或Blackberry相匹配 2.awk算术运算符 运算符 用途 ------------------ x^y x的y次幂 x**y 同上 x%y 计算x/y的余数(求模) x+y x加y x-y x减y x*y x乘y x/y x除y -y 负y(y的开关符号);也称一目减 ++y y加1后使用y(前置加) y++ 使用y值后加1(后缀加) --y y减1后使用y(前置减) y-- 使用后y减1(后缀减) x=y 将y的值赋给x x+=y 将x+y的值赋给x x-=y 将x-y的值赋给x x*=y 将x*y的值赋给x x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x x^=y 将x^y的值赋给x x**=y 将x**y的值赋给x 3.awk容许的测试: 操做符 含义 x==y x等于y x!=y x不等于y x>y x大于y x>=y x大于或等于y x<y x小于y x<=y x小于或等于y? x~re x匹配正则表达式re? x!~re x不匹配正则表达式re? 4.awk的操做符(按优先级升序排列) = 、+=、 -=、 *= 、/= 、 %= || && > >= < <= == != ~ !~ xy (字符串连结,'x'y'变成"xy") + - * / % ++ -- 5.awk内置变量(预约义变量) 说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawk V 变量 含义 缺省值 -------------------------------------------------------- N ARGC 命令行参数个数 G ARGIND 当前被处理文件的ARGV标志符 N ARGV 命令行参数数组 G CONVFMT 数字转换格式 %.6g P ENVIRON UNIX环境变量 N ERRNO UNIX系统错误消息 G FIELDWIDTHS 输入字段宽度的空白分隔字符串 A FILENAME 当前输入文件的名字 P FNR 当前记录数 A FS 输入字段分隔符 空格 G IGNORECASE 控制大小写敏感0(大小写敏感) A NF 当前记录中的字段个数 A NR 已经读出的记录数 A OFMT 数字的输出格式 %.6g A OFS 输出字段分隔符 空格 A ORS 输出的记录分隔符 新行 A RS 输入的记录他隔符 新行 N RSTART 被匹配函数匹配的字符串首 N RLENGTH 被匹配函数匹配的字符串长度 N SUBSEP 下标分隔符 "34" 6.awk的内置函数 V 函数 用途或返回值 ------------------------------------------------ N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string N index(search,string) 返回string中search串的位置 A length(string) 求串string中的字符个数 N match(string,reg) 返回常规表达式reg匹配的string中的位置 N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。 N split(string,store,delim) 根据分界符delim,分解string为store的数组元素 N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据 G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间 N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串 A substr(string,position,len) 返回一个以position开始len个字符的子串 P totower(string) 返回string中对应的小写字符 P toupper(string) 返回string中对应的大写字符 A atan(x,y) x的余切(弧度) N cos(x) x的余弦(弧度) A exp(x) e的x幂 A int(x) x的整数部分 A log(x) x的天然对数值 N rand() 0-1之间的随机数 N sin(x) x的正弦(弧度) A sqrt(x) x的平方根 A srand(x) 初始化随机数发生器。若是忽略x,则使用system() G system() 返回自1970年1月1日以来通过的时间(按秒计算)