分类: LINUX
2010-03-19 17:21:32
awk 是一种非常好的语言,适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。本文以及后续的文章将由浅入深通过实例讲解awk的用法。
首先,在当前目录里有个文件,假设文件名为address.in,内容如下:
1:abc:male:13612345678
2:mary:female:12345678
3:aaa:female:44445555
4:zlx:female:13550000000
5:lucy:female:13611111111
6:david:male:10101010
在命令行中输入以下命令:
$ awk '{ print }' address.in
结果将会显示address.in文件内容。调用awk时,我们指定address.in作为输入文件。执行awk时,它依次对address.in中的每一行执行print也就是打印命令。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。
若输入以下命令,它的作用与上例完全相同:
$ awk '{ print $0 }' address.in
在 awk 中,$0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样。当然还可以创建一个 awk 程序,让它输出与输入数据完全无关的数据。以下是一个示例:
$ awk '{ print "" }' address.in
只要将 "" 字符串传递给 print 命令,它就会打印空白行。如果测试该脚本,将会发现对于 address.in 文件中的每一行,awk 都输出一个空白行。以下是另一个示例:
$ awk '{ print "haha" }' address.in
运行这个脚本将在您的屏幕上写6行haha。
接下来我们来看看多个字段。awk 非常善于处理分成多个逻辑字段的文本,而且让您可以毫不费力地引用 awk 脚本中每个独立的字段。以下脚本将打印出address.in文件中的联系人姓名列表:
$ awk -F":" '{ print $2 }' address.in
结果如下:
abc
mary
aaa
zlx
lucy
david
上例中,在调用 awk 时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理 print $2 命令时,它会打印出在输入文件中每一行中出现的第二个字段。以下是另一个示例:
$ awk -F":" '{ print $2 $4 }' address.in
以下是该脚本的输入的输出结果:
abc13612345678
mary12345678
aaa44445555
zlx13550000000
lucy13611111111
david10101010
awk 打印出 address.in 文件的第二和第四个字段,它们正好分别是联系人姓名和电话。美中不足的是awk 会连接它们但不在它们之间添加空格。以下命令会在这两个字段中插入空格:
$ awk -F":" '{ print $2 " " $4 }' address.in
结果如下:
abc 13612345678
mary 12345678
aaa 44445555
zlx 13550000000
lucy 13611111111
david 10101010
以这种方式调用 print 时,它将连接 $2、" " 和 $4,创建可读的输出。当然,如果需要的话,我们还可以插入一些文本标签:
$ awk -F":" '{ print "name: " $2 "\ttel:" $4}' address.in
这将产生以下输出:
name: abc tel:13612345678
name: mary tel:12345678
name: aaa tel:44445555
name: zlx tel:13550000000
name: lucy tel:13611111111
name: david tel:10101010
非常简单吧,好了,今天就到这儿吧。后面跟进一步的用法以后再做讲解。