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) |