Chinaunix首页 | 论坛 | 博客
  • 博客访问: 194868
  • 博文数量: 49
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 492
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-08 16:23
文章分类

全部博文(49)

文章存档

2012年(8)

2011年(34)

2008年(7)

分类:

2011-04-26 23:39:06

awk是一种用于处理数据和生成报告的UNIX编程语言。nawk是awk的新版本,gawk是基于Linux的GNU版本。
awk以逐行方式扫描文件或输入,从第一行到最后一行,以查找匹配某个特定模式的文本行,并对这些文本行执行(括在花括号中的)指定动作。如果只给出模式而未指定动作,则所有匹配该模式的行都显示在屏幕上;如果只指定动作而未定义模式,会对所有输入行执行指定动作。
awk程序由awk命令、括在引号(或写在文件)中的程序指令以及输入文件的文件名几个部分组成。如果没有指定输入文件,输入则来自标准输入设备(stdin),即键盘。
awk指令由模式、操作或模式与操作的组合组成。
模式是由某种类型的表达式组成的语句。如果某个表达式中没有出现关键字if,但实际计算时却暗含if这个词,那么,这个表达式就是模式。模式由括在两个正斜杠之间的正则表达式、一个或多个awk操作符组成的表达式组成。
操作由括在大括号内的一条或多条语句组成,语句之间用分号或换行符隔开。
字段的分隔符是空白符
格式化输出
print函数用于打印不需要特别编排格式的简单输出,更为复杂的格式编排则要使用printf和sprintf函数。
转义序列用一个反斜杠后跟一个字母或数字来表示,它们可以用在字符串中,代表制表符、换行符、换页符等。
OFMT变量:打印数字时,可能需要控制数字的格式,这可以通过printf函数实现,但是,通过设置一个特殊的awk变量OFMT,使用print函数时也可以控制数字的打印格式。OFMT的默认值是“%.6gd”,表示只打印小数部分的前6位。例如:
[root@centos ~]# awk 'BEGIN{OFMT="%.2f";print 1.2456789,12E-2}' #百分号(%)表示接下来要定义的格式
1.25 0.12
使用printf函数来格式化特别的输出。
printf函数返回一个带格式的字符串给标准输出,其语句包括一个加引号的控制串,控制串中可能嵌入有若干格式说明和修饰符,控制串后面跟一个逗号,之后是一列由逗号分隔的表达式。printf函数根据控制串中的说明编排这些表达式的格式,与print函数不同的是,printf不会在行尾自动换行,必须在控制串中提供转义字符\n实现换行。

打印变量时,输出所在的位置称为“域”(field),域的宽度(width)是指该域中所包含的字符个数。
[root@centos ~]# awk '{printf "The name is: %-15s ID is %8d\n",$1,$3}' employees 
The name is: Tom             ID is     4424
The name is: Mary            ID is     5346
The name is: Sally           ID is     1654
The name is: Billy           ID is     1683
The name is: Fu              ID is     1456

文件中的awk命令:如果awk命令被写在文件里,就要用-f选项指定awk的文件名,后面再加上所要处理的输入文件的文件名。awk从缓冲区读入一条记录,接着测试awk文件中的每一条命令,然后对读入的记录执行命令。处理完第一条记录后,awk将其丢弃,接着将下一条记录读入缓冲区,依次处理所有记录。如果没有模式限制,默认的操作就是打印全部记录,而模式如果没有相应的操作,则默认行为就是打印匹配它的记录。
默认情况下,每一行称为一条记录,以换行符结束。
默认情况下,输入和输出记录的分隔符(行分隔符)都是回车符(换行符),分别保存在awk的内置变量ORS和RS中,ORS和RS的值可以修改,但是只能以特定方式进行修改。
awk用$0指代整条记录(当$0因替换或赋值而改变时,NF的值,即字段的数目也可能改变)。换行符的值保存在awk的内置变量RS中,其默认值为回车。
变量NR:每条记录的记录号都保存在awk的内置变量NR中。没处理完一条记录,NR的值都会加1。
[root@centos ~]# awk '{print NR,$0}' employees 
1 Tom Jones             4424    5/12/66         543354
2 Mary Adams            5346    11/4/63         28765
3 Sally Chang           1654    7/22/54         650000
4 Billy Black           1683    9/23/44         336500
5 Fu Hao                        1456    13/10/80        521455
每条记录都是由称为字段(field)的词组成,默认情况下,字段间用空白符(即空格或制表符)分隔。每个这样的词称为一个字段,awk在内置变量NF中保存记录的字段数。
[root@centos ~]# awk '{print $0,NF}' employees 
Tom Jones               4424    5/12/66         543354 5
Mary Adams              5346    11/4/63         28765 5
Sally Chang             1654    7/22/54         650000 5
Billy Black             1683    9/23/44         336500 5
Fu Hao                  1456    13/10/80        521455 5
awk的内置变量FS中保存了输入字段分隔符的值。使用FS的默认值时,awk用空格或制表符来分隔字段,并且删除各字段前多余的空格或制表符。可以通过在BEGIN语句中或命令上上赋值来改变FS的值。在命令行上改变FS的值需要使用-F选项,后面指定代表新分隔符的字符。
默认的输出字段分隔符是单个空格,被保存于awk的内置变量OFS中。
阅读(1422) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~