ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:26.12KB ,
资源ID:7755081      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7755081.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(awk详解.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

awk详解.docx

1、awk详解a w k是一种程序语言,对文档资料的处理具有很强的功能。awk 名称是由它三个最初设计者的姓氏的第一个字母而命名的: Alfred V. Aho、Peter J. We i n b e rg e r、Brian W. Kernighan。a w k最初在1 9 7 7年完成。1 9 8 5年发表了一个新版本的a w k,它的功能比旧版本增强了不少。a w k能够用很短的程序对文档里的资料做修改、比较、提取、打印等处理。如果使用C 或P a s c a l等语言编写程序完成上述的任务会十分不方便而且很花费时间,所写的程序也会很大。a w k不仅仅是一个编程语言,它还是L i n u

2、x系统管理员和程序员的一个不可缺少的工具。a w k语言本身十分好学,易于掌握,并且特别的灵活。gawk 是G N U计划下所做的a w k,gawk 最初在1 9 8 6年完成,之后不断地被改进、更新。gawk 包含awk 的所有功能。6.1 gawk的主要功能gawk 的主要功能是针对文件的每一行( l i n e ),也就是每一条记录,搜寻指定的格式。当某一行符合指定的格式时,gawk 就会在此行执行被指定的动作。gawk 依此方式自动处理输入文件的每一行直到输入文件档案结束。g a w k经常用在如下的几个方面: 根据要求选择文件的某几行,几列或部分字段以供显示输出。 分析文档中的某一

3、个字出现的频率、位置等。 根据某一个文档的信息准备格式化输出。 以一个功能十分强大的方式过滤输出文档。 根据文档中的数值进行计算。6.2 如何执行gawk程序基本上有两种方法可以执行g a w k程序。如果gawk 程序很短,则可以将gawk 直接写在命令行,如下所示:gawk program input-file1 input-file2 .其中program 包括一些pattern 和a c t i o n。如果gawk 程序较长,较为方便的做法是将gawk 程序存在一个文件中,gawk 的格式如下所示:gawk -f program-file input-file1 input-file

4、2 .gawk 程序的文件不止一个时,执行gawk 的格式如下所示:gawk -f program-file1 -f program-file2 . input-file1 input-file2 .6.3 文件、记录和字段一般情况下,g a w k可以处理文件中的数值数据,但也可以处理字符串信息。如果数据没有存储在文件中,可以通过管道命令和其他的重定向方法给g a w k提供输入。当然, g a w k只能处理文本文件(A S C I I码文件)。电话号码本就是一个g a w k可以处理的文件的简单例子。电话号码本由很多条目组成,每一个条目都有同样的格式:姓、名、地址、电话号码。每一个条目都

5、是按字母顺序排列。在g a w k中,每一个这样的条目叫做一个记录。它是一个完整的数据的集合。例如,电话号码本中的Smith John这个条目,包括他的地址和电话号码,就是一条记录。记录中的每一项叫做一个字段。在g a w k中,字段是最基本的单位。多个记录的集合组成了一个文件。大多数情况下,字段之间由一个特殊的字符分开,像空格、TA B、分号等。这些字符叫做字段分隔符。请看下面这个/ e t c / p a s s w d文件:t p a r k e r ; t 3 6 s 6 2 h s h ; 5 0 1 ; 1 0 1 ; Tim Parker;/home/tparker;/bin/b

6、ashetreijs;2ys639dj3h;502;101;Ed Tr e i j s ; / h o m e / e t r e i j s ; / b i n / t c s hy c h o w ; 1 h 2 7 s j ; 5 0 3 ; 1 0 1 ; Yvonne Chow;/home/ychow;/bin/bash你可以看出/ e t c / p a s s w d文件使用分号作为字段分隔符。/ e t c / p a s s w d文件中的每一行都包括七个字段:用户名;口令;用户I D;工作组I D;注释; h o m e目录;启始的外壳。如果你想要查找第六个字段,只需数过五

7、个分号即可。但考虑到以下电话号码本的例子,你就会发现一些问题:Smith John 13 Wilson St. 555-1283Smith John 2736 Artside Dr Apt 123 555-2736Smith John 125 Westmount Cr 555-1726虽然我们能够分辨出每个记录包括四个字段,但g a w k却无能为力。电话号码本使用空格作为分隔符,所以g a w k认为S m i t h是第一个字段, John 是第二个字段,1 3是第三个字段,依次类推。就g a w k而言,如果用空格作为字段分隔符的话,则第一个记录有六个字段,而第二个记录有八个字段。所以,

8、我们必须找出一个更好的字段分隔符。例如,像下面一样使用斜杠作为字段分隔符:Smith/John/13 Wilson St./555-1283Smith/John/2736 Artside Dr/Apt/123/555-2736Smith/John/125 Westmount Cr/555-1726如果你没有指定其他的字符作为字段分隔符,那么g a w k将缺省地使用空格或TA B作为字段分隔符。6.4 模式和动作在g a w k语言中每一个命令都由两部分组成:一个模式( p a t t e r n)和一个相应的动作(a c t i o n)。只要模式符合,g a w k就会执行相应的动作。其中

9、模式部分用两个斜杠括起来,而动作部分用一对花括号括起来。例如:/ p a t t e r n 1 / a c t i o n 1 / p a t t e r n 2 / a c t i o n 2 / p a t t e r n 3 / a c t i o n 3 所有的g a w k程序都是由这样的一对对的模式和动作组成的。其中模式或动作都能够被省略,但是两个不能同时被省略。如果模式被省略,则对于作为输入的文件里面的每一行,动作都会被执行。如果动作被省略,则缺省的动作被执行,既显示出所有符合模式的输入行而不做任何的改动。下面是一个简单的例子,因为gawk 程序很短,所以将gawk 程序直接写

10、在外壳命令行:gawk /tparker/ /etc/passwd此程序在上面提到的/ e t c / p a s s w d文件中寻找符合t p a r k e r模式的记录并显示(此例中没有动作,所以缺省的动作被执行)。让我们再看一个例子:gawk /UNIX/print $2 file2.data此命令将逐行查找f i l e 2 . d a t a文件中包含U N I X的记录,并打印这些记录的第二个字段。你也可以在一个命令中使用多个模式和动作对,例如:gawk /scandal/print $1 /rumor/print $2 gossip_file此命令搜索文件g o s s i

11、p _ f i l e中包括s c a n d a l的记录,并打印第一个字段。然后再从头搜索g o s s i p _ f i l e中包括r u m o r的记录,并打印第二个字段。6.5 比较运算和数值运算g a w k有很多比较运算符,下面列出重要的几个:= = 相等! = 不相等 大于 = 大于等于 100 testfile将会显示文件testfile 中那些第四个字段大于1 0 0的记录。下表列出了g a w k中基本的数值运算符。运算符说明示例+ 加法运算2+6- 减法运算6-3* 乘法运算2*5/ 除法运算8/4 乘方运算32 (=9)% 求余数9%4 (=1)例如:print

12、 $3/2显示第三个字段被2除的结果。在g a w k中,运算符的优先权和一般的数学运算的优先权一样。例如:print $1+$2*$3显示第二个字段和第三个字段相乘,然后和第一个字段相加的结果。你也可以用括号改变优先次序。例如:print ($1+$2)*$3显示第一个字段和第二个字段相加,然后和第三个字段相乘的结果。6.6 内部函数g a w k中有各种的内部函数,现在介绍如下:6.6.1 随机数和数学函数sqrt(x) 求x 的平方根sin(x) 求x 的正弦函数cos(x) 求x 的余弦函数a t a n 2 ( x,y) 求x / y的余切函数log(x) 求x 的自然对数exp(x

13、) 求x 的e 次方int(x) 求x 的整数部分rand() 求0 和1之间的随机数srand(x) 将x 设置为r a n d ( )的种子数6.6.2 字符串的内部函数 i n d e x ( i n,find) 在字符串in 中寻找字符串find 第一次出现的地方,返回值是字符串find 出现在字符串in 里面的位置。如果在字符串in 里面找不到字符串f i n d,则返回值为0。例如:print index(peanut, a n )显示结果3。 length(string) 求出string 有几个字符。例如:l e n g t h ( a b c d e )显示结果5。 m a

14、t c h ( s t r i n g,r e g e x p ) 在字符串string 中寻找符合regexp 的最长、最靠左边的子字符串。返回值是regexp 在string 的开始位置,即i n d e x值。match 函数将会设置系统变量R S TA RT 等于i n d e x的值,系统变量RLENGTH 等于符合的字符个数。如果不符合,则会设置R S TA RT 为0、RLENGTH 为- 1。 s p r i n t f ( f o r m a t,e x p r e s s i o n 1,. . . ) 和printf 类似,但是sprintf 并不显示,而是返回字符串。例

15、如:sprintf(pi = %.2f (approx.),2 2 / 7 )返回的字符串为pi = 3.14 (approx.) s u b ( r e g e x p,r e p l a c e m e n t,t a rg e t ) 在字符串t a rget 中寻找符合regexp 的最长、最靠左的地方,以字串replacement 代替最左边的r e g e x p。例如:str = water,w a t e r,e v e r y w h e r e s u b ( / a t /, i t h ,s t r )结果字符串s t r会变成w i t h e r,w a t e r

16、,e v e r y w h e r e g s u b ( r e g e x p,r e p l a c e m e n t,t a rget) 与前面的s u b类似。在字符串t a rget 中寻找符合r e g e x p的所有地方,以字符串replacement 代替所有的r e g e x p。例如:s t r = w a t e r,w a t e r,e v e r y w h e r e g s u b ( / a t /, i t h ,s t r )结果字符串s t r会变成w i t h e r,w i t h e r,e v e r y w h e r e s u

17、b s t r ( s t r i n g,s t a r t,length) 返回字符串string 的子字符串,这个子字符串的长度为l e n g t h,从第start 个位置开始。例如:s u b s t r ( w a s h i n g t o n ,5,3 )返回值为i n g如果没有length ,则返回的子字符串是从第start 个位置开始至结束。例如:s u b s t r ( w a s h i n g t o n ,5 )返回值为i n g t o n。 tolower(string) 将字符串s t r i n g的大写字母改为小写字母。例如:tolower(MiXe

18、D cAsE 123)返回值为mixed case 123。 toupper(string) 将字符串s t r i n g的小写字母改为大写字母。例如:toupper(MiXeD cAsE 123)返回值为MIXED CASE 123。6.6.3 输入输出的内部函数 close(filename) 将输入或输出的文件filename 关闭。 system(command) 此函数允许用户执行操作系统的指令,执行完毕后将回到g a w k程序。例如:BEGIN system(ls)6.7 字符串和数字字符串就是一连串的字符,它可以被g a w k逐字地翻译。字符串用双引号括起来。数字不能用双引

19、号括起来,并且g a w k将它当作一个数值。例如:gawk $1 != Tim print testfile此命令将显示第一个字段和Ti m不相同的所有记录。如果命令中Ti m两边不用双引号,g a w k将不能正确执行。再如:gawk $1 = 50 print testfile此命令将显示所有第一个字段和5 0这个字符串相同的记录。g a w k不管第一字段中的数值的大小,而只是逐字地比较。这时,字符串5 0和数值5 0并不相等。6.8 格式化输出我们可以让动作显示一些比较复杂的结果。例如:gawk $1 != Tim print $1,$ 5,$ 6,$2 testfile将显示t e

20、 s t f i l e文件中所有第一个字段和Ti m不相同的记录的第一、第五、第六和第二个字段。进一步,你可以在p r i n t动作中加入字符串,例如:gawk $1 != Tim print The entry for ,$ 1,is not Tim. ,$2 testfilep r i n t动作的每一部分用逗号隔开。借用C语言的格式化输出指令,可以让g a w k的输出形式更为多样。这时,应该用p r i n t f而不是p r i n t。例如:printf %5s likes this languagen,$ 2 p r i n t f中的%5s 部分告诉gawk 如何格式化输出

21、字符串,也就是输出5个字符长。它的值由printf 的最后部分指出,在此是第二个字段。 n是回车换行符。如果第二个字段中存储的是人名,则输出结果大致如下:Tim likes this languageG e o ff likes this languageMike likes this languageJoe likes this languagegawk 语言支持的其他格式控制符号如下: c 如果是字符串,则显示第一个字符;如果是整数,则将数字以ASCII 字符的形式显示。例如:printf “% c”,6 5结果将显示字母A。 d 显示十进制的整数。 i 显示十进制的整数。 e 将浮点数以

22、科学记数法的形式显示。例如:print “$ 4 . 3 e”,1 9 5 0结果将显示1 . 9 5 0 e + 0 3。 f 将数字以浮点的形式显示。 g 将数字以科学记数法的形式或浮点的形式显示。数字的绝对值如果大于等于0 . 0 0 0 1则以浮点的形式显示,否则以科学记数法的形式显示。 o 显示无符号的八进制整数。 s 显示一个字符串。 x 显示无符号的十六进制整数。1 0至1 5以a至f表示。 X 显示无符号的十六进制整数。1 0至1 5以A至F表示。 % 它并不是真正的格式控制字符,% %将显示%。当你使用这些格式控制字符时,你可以在控制字符前给出数字,以表示你将用的几位或几个字

23、符。例如,6 d表示一个整数有6位。再请看下面的例子:printf %5s works for %5s and earns %2d an hour,$ 1,$ 2,$ 3 将会产生类似如下的输出:Joe works for Mike and earns 12 an hour当处理数据时,你可以指定数据的精确位数printf %5s earns $%.2f an hour,$ 3,$ 6 其输出将类似于:Joe earns $12.17 an hour你也可以使用一些换码控制符格式化整行的输出。之所以叫做换码控制符,是因为g a w k对这些符号有特殊的解释。下面列出常用的换码控制符:a 警告或

24、响铃字符。b 后退一格。f 换页。n 换行。r 回车。t Ta b。v 垂直的t a b。6.9 改变字段分隔符在g a w k中,缺省的字段分隔符一般是空格符或TA B。但你可以在命令行使用- F选项改变字符分隔符,只需在- F后面跟着你想用的分隔符即可。gawk -F ;/tparker/print /etc/passwd在此例中,你将字符分隔符设置成分号。注意: - F必须是大写的,而且必须在第一个引号之前。6.10 元字符g a w k语言在格式匹配时有其特殊的规则。例如, c a t能够和记录中任何位置有这三个字符的字段匹配。但有时你需要一些更为特殊的匹配。如果你想让c a t只和c

25、 o n c a t e n a t e匹配,则需要在格式两端加上空格:/ cat / print再例如,你希望既和c a t又和C AT匹配,则可以使用或(|):/ cat | CAT / print在g a w k中,有几个字符有特殊意义。下面列出可以用在g a w k格式中的这些字符: 表示字段的开始。例如:$3 /b/如果第三个字段以字符b开始,则匹配。 $ 表示字段的结束。例如:$3 /b$/如果第三个字段以字符b结束,则匹配。 . 表示和任何单字符m匹配。例如:$3 /i.m/如果第三个字段有字符i,则匹配。 | 表示“或”。例如:/ c a t | C AT/和cat 或C AT

26、字符匹配。 * 表示字符的零到多次重复。例如:/UNI*X/和U N X、U N I X、U N I I X、U N I I I X等匹配。 + 表示字符的一次到多次重复。例如:/UNI+X/和U N I X、U N I I X等匹配。 a,b 表示字符a次到b次之间的重复。例如:/ U N I 1,3 X和U N I X、U N I I X和U N I I I X匹配。 ? 表示字符零次和一次的重复。例如:/UNI?X/和UNX 和U N I X匹配。 表示字符的范围。例如:/IBDGM/和I B M、I D M和I G M匹配 表示不在 中的字符。例如:/IDEM/和所有的以I开始、M结束

27、的包括三个字符的字符串匹配,除了I D M和I E M之外。6.11 调用gawk程序当需要很多对模式和动作时,你可以编写一个g a w k程序(也叫做g a w k脚本)。在g a w k程序中,你可以省略模式和动作两边的引号,因为在g a w k程序中,模式和动作从哪开始和从哪结束时是很显然的。你可以使用如下命令调用g a w k程序:gawk -f script. filename此命令使g a w k对文件f i l e n a m e执行名为s c r i p t的g a w k程序。如果你不希望使用缺省的字段分隔符,你可以在f选项后面跟着F选项指定新的字段分隔符(当然你也可以在g

28、a w k程序中指定),例如,使用分号作为字段分隔符:gawk -f script. -F; filename如果希望gawk 程序处理多个文件,则把各个文件名罗列其后:gawk -f script. filename1 filename2 filename3 .缺省情况下, g a w k的输出将送往屏幕。但你可以使用L i n u x的重定向命令使g a w k的输出送往一个文件:gawk -f script. filename save_file6.12 BEGIN和END有两个特殊的模式在g a w k中非常有用。B E G I N模式用来指明g a w k开始处理一个文件之前执行一些

29、动作。B E G I N经常用来初始化数值,设置参数等。E N D模式用来在文件处理完成后执行一些指令,一般用作总结或注释。BEGIN 和E N D中所有要执行的指令都应该用花括号括起来。BEGIN 和E N D必须使用大写。请看下面的例子:BEGIN print Starting the process the file $1 = UNIX print$2 10 printf This line has a value of %d,$ 2 END print Finished processing the file. Bye!此程序中,先显示一条信息: Starting the proces

30、s the file,然后将所有第一个字段等于U N I X的整条记录显示出来,然后再显示第二个字段大于10 的记录,最后显示信息: F i n i s h e dprocessing the file. Bye!。6.13 变量在g a w k中,可以用等号( = )给一个变量赋值:var1 = 10在g a w k中,你不必事先声明变量类型。请看下面的例子:$1 = Plastic count = count + 1 如果第一个字段是P l a s t i c,则c o u n t的值加1。在此之前,我们应当给c o u n t赋予过初值,一般是在B E G I N部分。下面是比较完整的例子:BEGIN count = 0 $5 = UNIX count = count + 1

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1