AWK增强的文本处理shell特征--AWK完全手册
AWK这是一个很好的文字处理工具。
它不仅 Linux 中也是不论什么环境中现有的功能最强大的数据处理引擎之中的一个。
本文主要摘录池中龙写的Unixawk使用手冊(第二版),对当中内容略微修改。感谢作者的分享。
0作者的话
《UNIXAWK使用手冊》是我几个月前的作品了,回过头来看,这篇文章实在是非常粗燥,因当时我写作并上传这个作品时实在是太忙了,没有对文章的质量进行非常好的检查,心里老认为有愧于网友的厚爱。于是趁闲赶忙重写一遍,尽管不一定会有非常大的改观,但质量是肯定要好一点的。唯如此。我的良心上才好受一点。呶,以下就是我的改动稿,各位老友请与第一版相比一下。看是否有所进步。
这次改写仍然保留了原有的风格:正文由浅入深,文后附上了大量的相关资料,这样做的原因是为了满足各种用户的需求。这在第一版中已经说过了。
这次基本的改变是在内容上,添加了非常多新内容。并添加了演示样例。以帮助读者理解当中的内容,附录也补充了很多新的资料。当然读者要真正地掌握awk,只读了本文是不够的。还必须有上机实习这一步。值得提醒大家的是,awk有非常多版本号。并且各个版本号之间存在着一些区别。因此,在使用awk曾经最好參考一下你使用的系统的联机帮助。
什么是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的三位创建者已将它正式定义为:样式扫描和处理语言(注:这里的样式指pattern)。
为什么使用awk?
即使如此。你或许仍然会问,我为什么要使用awk?
使用awk的第一个理由是基于文本的样式扫描和处理是我们常常做的工作,awk所做的工作有些象数据库,但与数据库不同的是。它处理的是文本文件,这些文件没有专门的存储格式。普通的人们就能编辑、阅读、理解和处理它们。
而数据库文件往往具有特殊的存储格式。这使得它们必须用数据库处理程序来处理它们。既然这样的类似于数据库的处理工作我们常常会遇到,我们就应当找到处理它们的简便易行的方法。UNIX有非常多这方面的工具,比如sed、grep、sort以及find等等。awk是当中十分优秀的一种。
使用awk的第二个理由是awk是一个简单的工具,当然这是相对于其强大的功能来说的。
的确,UNIX有很多优秀的工具,比如UNIX天然的开发工具C语言及其延续C++就非常的优秀。但相对于它们来说。awk完毕相同的功能要方便和简捷得多。这首先是由于awk提供了适应多种须要的解决方式:从解决简单问题的awk命令行到复杂而静止的awk程序设计语言,这样做的优点是,你能够不必用复杂的方法去解决本来非常easy的问题。比如,你能够用一个命令行解决简单的问题,而C不行,即使一个再简单的程序,C语言也必须经过编写、编译的全过程。其次。awk本身是解释运行的,这就使得awk程序不必经过编译的过程,同一时候,这也使得它与shellscript程序能够非常好的契合。
最后,awk本身较C语言简单,尽管awk吸收了C语言非常多优秀的成分。熟悉C语言会对学习awk有非常大的帮助。但awk本身不须要会使用C语言——一种功能强大但须要大量时间学习才干掌握其技巧的开发工具。
使用awk的第三个理由是awk是一个easy获得的工具。与C和C++语言不同,awk仅仅有一个文件(/bin/awk),并且差点儿每一个版本号的UNIX都提供各自版本号的awk,你全然不必费心去想怎样获得awk。但C语言却不是这样。尽管C语言是UNIX天然的开发工具,但这个开发工具却是单独发行的。换言之。你必须为你的UNIX版本号的C语言开发工具单独付费(当然使用D版者除外),获得并安装它,然后你才干够使用它。
基于以上理由。再加上awk强大的功能,我们有理由说,假设你要处理与文本样式扫描相关的工作,awk应该是你的第一选择。在这里有一个可遵循的一般原则:假设你用普通的shell工具或shellscript有困难的话,试试awk,假设awk仍不能解决这个问题。则便用C语言,假设C语言仍然失败,则移至C++。
1awk的调用方式
前面以前说过。awk提供了适应多种须要的不同解决方式。它们是:
1)awk命令行。
你能够象使用普通UNIX命令一样使用awk,在命令行中你也能够使用awk程序设计语言,尽管awk支持多行的录入。可是录入长长的命令行并保证其正确无误却是一件令人头疼的事。因此。这样的方法一般仅仅用于解决简单的问题。当然,你也能够在shellscript程序中引用awk命令行甚至awk程序脚本。
2)使用-f选项调用awk程序。awk同意将一段awk程序写入一个文本文件。然后在awk命令行中用-f选项调用并运行这段程序。详细的方法我们将在后面的awk语法中讲到。
3)利用命令解释器调用awk程序。利用UNIX支持的命令解释器功能。我们能够将一段awk程序写入文本文件,然后在它的第一行加上:
#!/bin/awk-f
并赋予这个文本文件以运行的权限。这样做之后。你就能够在命令行中用类似于以下这种方式调用并运行这段awk程序了。
$awk脚本文本名待处理文件
2awk的语法
与其他UNIX命令一样,awk拥有自己的语法:
awk[ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
參数说明:
1)-Fre:同意awk更改其字段分隔符。
2)parameter: 该參数帮助为不同的变量赋值。
3)'prog':awk的程序语句段。这个语句段必须用单引號:'和'括起。以防被shell解释。
这个程序语句段的标准形式为:
'pattern{action}'
当中pattern參数能够是egrep正則表達式中的不论什么一个,它能够使用语法/re/再加上一些样式匹配技巧构成。与sed类似。你也能够使用","分开两样式以选择某个范围。关于匹配的细节。你能够參考附录。假设仍不懂的话。找本UNIX书学学grep和sed(本人是在学习sed时掌握匹配技术的)。
action參数总是被大括号包围,它由一系统awk语句组成,各语句之间用";"分隔。awk解释它们,并在pattern给定的样式匹配的记录上运行其操作。与shell类似,你也能够使用“#”作为凝视符,它使“#”到行尾的内容成为凝视,在解释运行时,它们将被忽略。
你能够省略pattern和action之中的一个。但不能两者同一时候省略,当省略pattern时没有样式匹配,表示对全部行(记录)均运行操作。省略action时运行缺省的操作——在标准输出上显示。
4)-f progfile:同意awk调用并运行progfile指定的程序文件。progfile是一个文本文件,他必须符合awk的语法。
5)in_file:awk的输入文件。awk同意对多个输入文件进行处理。值得注意的是awk不改动输入文件。假设未指定输入文件。awk将接受标准输入。并将结果显示在标准输出上。awk支持输入输出重定向。
3awk的记录、字段与内置变量
前面说过,awk处理的工作与数据库的处理方式有同样之处,其同样处之中的一个就是awk支持对记录和字段的处理。当中对字段的处理是grep和sed不能实现的,这也是awk优于二者的原因之中的一个。在awk中,缺省的情况下总是将文本文件里的一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。
为了操作这些不同的字段,awk借用shell的方法,用$1,$2,$3...这种方式来顺序地表示行(记录)中的不同字段。
特殊地,awk用$0表示整个行(记录)。不同的字段之间是用称作分隔符的字符分隔开的。
系统默认的分隔符是空格。awk同意在命令行中用-Fre的形式来改变这个分隔符。其实,awk用一个内置的变量FS来记忆这个分隔符。
awk中有好几个这种内置变量。比如,记录分隔符变量RS、当前工作的记录数NR等等。本文后面的附表列出了所有的内置变量。这些内置的变量能够在awk程序中引用或改动,比如,你能够利用NR变量在模式匹配中指定工作范围,也能够通过改动记录分隔符RS让一个特殊字符而不是换行符作为记录的分隔符。
例:显示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:
$awk -F % 'NR==7,NR==15{printf $1 $3 $7}' myfile
4awk的内置函数
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\n",NR,$1}' myfile
5在命令行使用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字段(第二字段)是否为"*",如不为"*"。则表示该用户没有设置password,显示出这些username(第一字段)。我们能够用例如以下语句实现:
#awk-F: '$2==""{printf("%s no password!\n",$1}'/etc/passwd
在这个演示样例中。passwd文件的字段分隔符是“:”。因此。必须用-F:来更改默认的字段分隔符。这个演示样例中也涉及到了内置函数printf的使用。
6awk的变量
如同其他程序设计语言一样,awk同意在程序语言中设置变量。其实,提供变量的功能是程序设计语言的其本要求。不提供变量的程序设计语言本人还从未见过。
awk提供两种变量,一种是内置变量。这前面我们已经讲过,须要着重指出的是,与后面提到的其他变量不同的是。在awk程序中引用内置变量不须要使用标志符"$"(回顾一下前面讲过的NR的使用)。awk提供的还有一种变量是自己定义变量。awk同意用户在awk程序语句中定义并调用自已的变量。
当然这样的变量不能与内置变量及其他awk保留字同样。在awk中引用自己定义变量必须在它前面加上标志符"$"。
与C语言不同的是,awk中不须要对变量进行初始化,awk依据其在awk中第一次出现的形式和上下文确定其详细的数据类型。当变量类型不确定时。awk默认其为字符串类型。
这里有一个技巧:假设你要让你的awk程序知道你所使用的变量的明白类型,你应当在在程序中给它赋初值。在后面的实例中。我们将用到这一技巧。
7运算与推断
作为一种程序设计语言所应具有的特点之中的一个。awk支持多种运算,这些运算与C语言提供的基本同样:如+、-、*、/、%等等,同一时候。awk也支持C语言中类似++、--、+=、-=、=+、=-之类的功能,这给熟悉C语言的使用者编写awk程序带来了极大的方便。作为对运算功能的一种扩展,awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。
作为对条件转移指令的一部分,关系推断是每种程序设计语言都具备的功能,awk也不例外。awk中同意进行多种測试,如经常使用的==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、>=(小于等于)等等。同一时候,作为样式匹配,还提供了~(匹配于)和!
~(不匹配于)推断。
作为对測试的一种扩充,awk也支持用逻辑运算符:!(非)、&&(与)、||(或)和括号()进行多重推断。这大大增强了awk的功能。本文的附录中列出了awk所同意的运算、推断以及操作符的优先级。
8awk的流程控制
流程控制语句是不论什么程序设计语言都不能缺少的部分。不论什么好的语言都有一些运行流程控制的语句。awk提供的完备的流程控制语句类似于C语言。这给我们编程带来了极大的方便。
8.1BEGIN和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则在扫描完毕后打印出总合计。
8.2流程控制语句
awk提供了完备的流程控制语句,其使用方法与C语言类似。以下我们一一加以说明:
8.2.1if...else语句:
格式:
if(表达式)
语句1
else
语句2
格式中"语句1"能够是多个语句,假设你为了方便awk推断也方便你自已阅读。你最好将多个语句用{}括起来。
awk分枝结构同意嵌套,其格式为:
if(表达式1)
{if(表达式2)
语句1
else
语句2
}
语句3
else{if(表达式3)
语句4
else
语句5
}
语句6
当然实际操作过程中你可能不会用到如此复杂的分枝结构,这里仅仅是为了给出其样式罢了。
8.2.2while语句
格式为:
while(表达式)
语句
8.2.3do-while语句
格式为:
do
{
语句
}while(条件推断语句)
8.2.4for语句
格式为:
for(初始表达式;终止条件;步长表达式)
{语句}
在awk的while、do-while和for语句中同意使用break,continue语句来控制流程走向。也同意使用exit这种语句来退出。break中断当前正在运行的循环并跳到循环外运行下一条语句。continue从当前位置跳到循环開始处运行。对于exit的运行有两种情况:当exit语句不在END中时,不论什么操作中的exit命令表现得如同到了文件尾,全部模式或操作运行将停止。END模式中的操作被运行。而出如今END中的exit将导致程序终止。
9awk中的自己定义函数
定义和调用用户自己的函数是差点儿每一个高级语言都具有的功能,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\n",pageno);
>}
>#定义函数print_header
>functionprint_header(FileName,PageNum){
>printf("%s%d\n",FileName,PageNum);
>PageNum++;
>returnPageNUm;
>}
>}' myfile
运行这个程序将显演示样例如以下内容:
myfile1
当前页页号是:2
10awk高级输入输出
10.1读取下一条记录:
awk的next语句导致awk读取下一个记录并完毕模式匹配。然后马上运行对应的操作。通常它用匹配的模式运行操作中的代码。next导致这个记录的不论什么额外匹配模式被忽略。
10.2简单地读取一条记录
awk的getline语句用于简单地读取一条记录。假设用户有一个数据记录类似两个物理记录,那么getline将尤事实上用。它完毕一般字段的分离(设置字段变量$0FNR
NFNR)。假设成功则返回1。失败则返回0(到达文件尾)。假设需简单地读取一个文件,则能够编写下面代码:
例:演示样例getline的使用
{while(getline==1)
{
#processthe inputted fields
}
}
也能够使getline保存输入数据在一个字段中,而不是通过使用getlinevariable的形式处理一般字段。当使用这样的方式时,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 fromthe who command
}
}
当然,也能够使用例如以下形式:
"command"| getline variable
10.3关闭文件:
awk中同意在程序中关闭一个输入或输出文件。方法是使用awk的close语句。
close("filename")
filename能够是getline打开的文件(也能够是stdin,包括文件名称的变量或者getline使用的确切命令)。
或一个输出文件(能够是stdout。包括文件名称的变量或使用管道的确切命令)。
10.4输出到一个文件:
awk中同意用例如以下方式将结果输出到一个文件:
printf("helloword!\n")>"datafile"
或
printf("helloword!\n")>>"datafile"
10.5输出到一个命令
awk中同意用例如以下方式将结果输出到一个命令:
printf("helloword!\n")|"sort-t','"
10awk与shellscript混合编程
由于awk能够作为一个shell命令使用,因此awk能与shell批处理程序非常好的融合在一起,这给实现awk与shell程序的混合编程提供了可能。
实现混合编程的关键是awk与shellscript之间的对话。换言之,就是awk与shellscript之间的信息交流:awk从shellscript中获取所需的信息(一般是变量的值)、在awk中运行shell命令行、shellscript将命令运行的结果送给awk处理以及shellscript读取awk的运行结果等等。
10.1awk读取Shellscript程序变量
在awk中我们能够通过“'$变量名'”的方式读取shellscrpit程序中的变量。
例:在以下的演示样例中,我们将读取sellscrpit程序中的变量Name,该变量存放的是文本myfile的撰写者,awk将打印出这个人名。
$catwritename
# !/bin/sh
Name="张三"
awk'BEGIN {name="'$Name'";\
printf("\t%s\t撰写者%s\n",FILENAME,name");}\
{...}END{...}' myfile
10.2将shell命令的运行结果送给awk处理
作为信息传送的一种方法。我们能够将一条shell命令的结果通过管道线(|)传递给awk处理:
例:演示样例awk处理shell命令的运行结果
$who-u | awk '{printf("%s正在运行%s\n",$2,$1)}'
该命令将打印出注冊终端正在运行的程序名。
10.3shell script程序读awk的运行结果
为了实现shellscript程序读取awk运行的结果,我们能够採取一些特殊的方法,比如我们能够用变量名=`awk语句`的形式将awk运行的结果存放入一个shellscript变量。当然也能够用管道线的方法将awk运行结果传递给shellscript程序处理。
例:作为传送消息的机制之中的一个,UNIX提供了一个向其全部用户传送消息的命令wall(意思是writetoall写给全部用户),该命令同意向全部工作中的用户(终端)发送消息。为此,我们能够通过一段shell批处理程序wall.shell来模拟这一程序(其实比較老的版本号中wall就是一段shell批处理程序:
$catwall.shell
#!/bin/sh
who -u | awk '{print $2}' |while read tty
do
cat /tmp/$$>$tty #$$的作用是产生随机的数字?
!!
done
在这个程序里。awk接受who-u命令的运行结果,该命令打印出全部已注冊终端的信息,当中第二个字段是已注冊终端的设备名,因此用awk命令析出该设备名。然后用whileread
tty语句循环读出这些文件名称到变量(shellscript变量)tty中。作为信息传送的终结地址。
10.4在awk中运行shell命令行----嵌入函数system()
system()是一个不适合字符或数字类型的嵌入函数,该函数的功能是处理作为參数传递给它的字符串。system对这个參数的处理就是将其作为命令处理,也就是说将其当作命令行一样加以运行。
这使得用户在自己的awk程序须要时能够灵活地运行命令或脚本。
例:以下的程序将使用system嵌入函数打印用户编制好的报表文件,这个文件存放在名为myreport.txt的文件里。为简约起见,我们仅仅列出了其END部分:
.
.
.
END{close("myreport.txt");system("lpmyreport.txt");}
在这个演示样例中,我们首先使用close语句关闭了文件myreport.txt文件。然后使用system嵌入函数将myreport.txt送入打印机打印。
写到这里,我不得不跟朋友们说再见了,实在地说,这些内容仍然是awk的初步知识,电脑永远是前进的科学。awk也不例外。本篇所能做的仅仅是在你前行的漫漫长途中铺平一段小小开端。剩下的路还得靠你自己去走。
老实说,假设本文真能给你前行的路上带来些许的方便,那本人就知足了!
如对本篇有不论什么疑问,请E-mailTo:Chizlong@yeah.net或到主页http://chizling.yeah.net中留言。
附录
附1awk的常规表达式元字符
\换码序列
^在字符串的开头開始匹配
$在字符串的结尾開始匹配
.与不论什么单个字符串匹配
[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相匹配
附2awk算术运算符
运算符用途
------------------
x^yx的y次幂
x**y同上
x%y计算x/y的余数(求模)
x+yx加y
x-yx减y
x*yx乘y
x/yx除y
-y负y(y的开关符号);也称一目减
++yy加1后使用y(前置加)
y++使用y值后加1(后缀加)
--yy减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的值赋给xx%=y
将x%y的值赋给x
x^=y将x^y的值赋给x
x**=y将x**y的值赋给x
附3awk同意的測试
操作符含义
x==yx等于y
x!=yx不等于y
x>yx大于y
x>=yx大于或等于y
x<yx小于y
x<=yx小于或等于y?
x~rex匹配正則表達式re?
x!~rex不匹配正則表達式re?
附4awk的操作符(按优先级升序排列)
=、+=、-=、*=
、/=、
%=
||
&&
>>= < <= == != ~ !~
xy (字符串连结,'x''y'变成"xy")
+-
* / %
++ --
附5awk内置变量(提前定义变量)
说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIXawk,G=gawk
变量含义缺省值
--------------------------------------------------------
ARGC命令行參数个数
ARGIND当前被处理文件的ARGV标志符
ARGV命令行參数数组
CONVFMT数字转换格式%.6g
ENVIRONUNIX环境变量
ERRNOUNIX系统错误消息
FIELDWIDTHS输入字段宽度的空白分隔字符串
FILENAME当前输入文件的名字
FNR当前记录数
FS输入字段分隔符空格
IGNORECASE控制大写和小写敏感0(大写和小写敏感)
NF当前记录中的字段个数
NR已经读出的记录数
OFMT数字的输出格式%.6g
OFS输出字段分隔符空格
ORS输出的记录分隔符新行
RS输入的记录他隔符新行
RSTART被匹配函数匹配的字符串首
RLENGTH被匹配函数匹配的字符串长度
SUBSEP下标分隔符"\034"
附6awk的内置函数
函数用途或返回值
------------------------------------------------
gsub(reg,string,target)每次常规表达式reg匹配时替换target中的string
index(search,string)返回string中search串的位置
length(string)求串string中的字符个数
match(string,reg)返回常规表达式reg匹配的string中的位置
printf(format,variable)格式化输出,按format提供的格式输出变量variable。
split(string,store,delim)依据分界符delim,分解string为store的数组元素
sprintf(format,variable)返回一个包括基于format的格式化数据。variables是要放到串中的数据
strftime(format,timestamp)返回一个基于format的日期或者时间串。timestmp是systime()函数返回的时间
sub(reg,string,target)第一次当常规表达式reg匹配,替换target串中的字符串
substr(string,position,len)返回一个以position開始len个字符的子串
tolower(string)返回string中相应的小写字符
toupper(string)返回string中相应的大写字符
atan(x,y)x的余切(弧度)
cos(x)x的余弦(弧度)
exp(x)e的x幂
int(x)x的整数部分
log(x)x的自然对数值
rand()0-1之间的随机数
sin(x)x的正弦(弧度)
sqrt(x)x的平方根
srand(x)初始化随机数发生器。假设忽略x,则使用system()
system()返回自1970年1月1日以来经过的时间(按秒计算)
參考资料
1、《精通UNIX》(《UnderstandingUNIX》[美]StanKelly-Bootle
著李永峰等译电子工业出版社)
2、《unix使用指南》(第2版)(UsingUNIX(SecondEdition)SteveMoritsugu等原著张拥军、韩柯、原小玲等译电子工业出版社出版、发行)
3、unix联机手冊:scoOpenSrever 5.05版.
4、感谢无名的网路资源提供者,因为你们辛勤而无私的劳动,INTERNET只是如此美妙!
版权声明:本文博客原创文章。博客,未经同意,不得转载。