Chinaunix首页 | 论坛 | 博客
  • 博客访问: 926903
  • 博文数量: 335
  • 博客积分: 10287
  • 博客等级: 上将
  • 技术积分: 3300
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 15:29
文章分类

全部博文(335)

文章存档

2015年(4)

2014年(15)

2013年(17)

2012年(11)

2011年(12)

2010年(96)

2009年(27)

2008年(34)

2007年(43)

2006年(39)

2005年(37)

我的朋友

分类: 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

运行这个脚本将在您的屏幕上写6haha

接下来我们来看看多个字段。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

    非常简单吧,好了,今天就到这儿吧。后面跟进一步的用法以后再做讲解。
阅读(425) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~