gawk详解(二)

来源:互联网 发布:数据清新图 编辑:程序博客网 时间:2024/06/13 05:57
1)改变字段分隔符
gawk中,缺省的字段分隔符一般是空格符或TAB。也可以在命令行使用-F选项改变字符分隔符,只需在-F后面跟着你想用的分隔符即可。
例如:gawk -F";"'/root/ {print}' /etc/passwd
2)简单的正则表达式
gawk语言在格式匹配时符合正则表达式。
^ 表示字段的开始。
例如:$3 ~ /^b/    如果第三个字段以字符b开始,则匹配。
$ 表示字段的结束。例如:$3 ~ /b$/    如果第三个字段以字符b结束,则匹配。
. 表示和任何单字符m匹配。例如:$3 ~ /i.m/    如果第三个字段有字符i,则匹配。
| 表示“或”。例如:/cat | CAT/    和cat 或CAT字符匹配。
* 表示字符的零到多次重复。例如:/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 和UNIX匹配。
[] 表示字符的范围。例如:/I[BDG]M/    和IBM、IDM和IGM匹配。
[^] 表示不在[]中的字符。例如:/I[^DE]M/    和所有的以I开始、M结束的包括三个字符的字符串匹配,除了IDM和IEM之外。
3)BEGIN和END
BEGIN模式用来指明gawk开始处理一个文件之前执行一些动作。BEGIN经常用来初始化数值,设置参数等。
END模式用来在文件处理完成后执行一些指令,一般用作总结或注释。
BEGIN和END中所有要执行的指令都应该用花括号括起来。BEGIN和END必须使用大写。
例如:
    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!"}
4)变量
在gawk中,可以用等号"="给一个变量赋值,变量不用事先声明。
变量可以和字段和数值一起使用。
变量也可以作为格式的一部分使用。
内置变量
gawk中有几个十分有用的内置变量:
NR 已经读取过的记录数。
FNR 从当前文件中读出的记录数。
FILENAME输入文件的名字。
FS 字段分隔符(缺省为空格)。
RS 记录分隔符(缺省为换行)。
OFMT 数字的输出格式(缺省为%g)。
OFS 输出字段分隔符。
ORS 输出记录分隔符。
NF 当前记录中的字段数。
5)控制结构
if表达式:
if 表达式的语法:
if (expression){    动作的每一部分用逗号隔开。
commands
}
else{
commands
}
while循环
while 循环的语法:
while (expression){
commands
}
for循环
for 循环的语法如下:
for (initialization; expression; increment) {
commands
}
next和exit
next指令用来告诉gawk处理文件中的下一个记录,而不管现在正在做什么,类似于C中的continue。
gawk运行到exit指令后,就转到程序的末尾去执行END,如果有END的话。
6)数组
gawk语言支持数组结构。数组不必事先初始化。声明一个数组的方法如下:
arrayname[num] = value
请看下面的例子:
#将文件中的行逆向输出
{line[NR] = $0 } # remember each line
END {var=NR # output lines in reverse order
while (var > 0){
print line[var]
var--
}
}
7)自定义函数
复杂的gawk程序常常可以使用自己定义的函数来简化。
调用用户自定义函数与调用内部函数的方法一样。
函数的定义可以放在gawk 程序的任何地方。
用户自定义函数的格式:
function name (parameter-list) {
body-of-function
}

注意:awk只能处理文本文件,如果不是文件的话,可以通过管道或是其他重定向方式将数据递交给awk。
print动作的每一部分用逗号隔开。