Chinaunix首页 | 论坛 | 博客
  • 博客访问: 323197
  • 博文数量: 173
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1060
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-09 16:23
文章分类

全部博文(173)

文章存档

2015年(66)

2014年(107)

我的朋友

分类: LINUX

2014-11-16 18:20:20

1. awk最基本的功能是在输入文件中按行匹配指定的字符串格式,如果匹配则将当前行复制到缓冲区进行进一步处理,但并不改变输入文件本身。awk匹配每一行(称为Record)后,使用默认或指定的分割符自动将其分割为若干段(称为Field),每一段可使用$number进行引用和访问。其中段号0对应整个Record的内容。处理完成每一行后继续读入下一行进行处理。

awk命令的一般格式为

awk ‘/pattern/ {action}/pattern1/{action1}’  datafile1 datafile2

awk可以同时指定多个匹配条件和处理动作(规则),每条规则之间可以另起新行分割,只要将它们包含在同一单引号里面即可。awk可以同时处理多个文件对象。

如果省略{action},则awk默认打印所有匹配pattern的行。如果想要指定不作任何事情,怎可省略action的同时,只保留{}。

2. 有三种方法运行awk程序。

awk‘program’ datafile1 datafile2 …

这里的program即pattern和action的组合,方式如前述。

awk–f program-file datafile1 datafile2 …

适用于程序较为复杂的情形。将/pattern/{action}组合放入program-file(不需要加单引号)后即可调用。为了使程序文件一目了然,可使用后缀名.awk。

将awk程序写为脚本文件后执行。

在脚本文件行首加上 #!/bin/awk –f,然后BEGIN{}块指定主程序执行的先决条件,中间是主程序,最后是END{}块指定结束操作。运行时,按脚本方式运行,并在后面指定输入文件。

需要注意的是,awk脚本和脚本中执行awk语句是不同的,前者使用awk程序的语法规则;后者只是将前两种用法写入文件执行,遵从shell脚本的语法规则。

3.读入文件时,除了使用默认的方式按行读入Record,也可以指定其它的Record Separator。

awk ‘BEGIN {RS = “/”}; {print $0}’ datafile

使用awk内置变量RS指定新的Record分割符为/。因为awk打印时在每一条Record后重起新行,这样通过指定新的分割符,就为datafile添加了新的换行。特别地,若指定RS为空字符,则以空行为分割符。awk利用内置变量FNR追踪当前读入的行号(记录号)。每次读入新文件时,FNR将自动置为0。另外一个变量NR记录当前awk一共读入了的行数(记录数),该变量从0开始,但即使读入新文件也不会重新置0。如果在主程序中重新设定了RS,则只会影响设定后读入的内容。

4.对于读入的每一行(记录),awk默认以(一个或多个)空格/制表符为分段符将其划分为若干段(Field),每一段可使用$number进行引用和访问,其中number可以是可计算数值的变量或表达式。$0对应整条记录,$NF对应最后一个分段。如果记录号大于总分段数,则返回空字符,但可以对其进行赋值操作后打印。注意,不带$的NF对应一个内置变量,它的值是当前记录的分段数量。例如:

awk ‘$1 ~ /pattern/ {print $!, $NF} ’ datafile

awk ‘$1 ~ /pattern/ {print $!, $NF} ’ datafile上例中打印datafile中所有行中首个分段包含pattern的行的第一个分段和最后一个分段。~是匹配运算符,它检验给定字符串($1)是否匹配之后的正则表达式。除了默认的分割符,awk允许指定字符或正则表达式作为分割符。分割符不出现在分段中。awk使用内置变量FS指定段分割符。

awk ‘BEGIN {FS = “:”}; {print $0}’ datafile使用命令行指定分割符时,可使用参数–F。

awk –F, ‘/pattern/{action}’ datafile上例指定“,”为段分隔符。

5. 使用print打印多个分段时,默认以空白作为间隔符,但也可以使用内置变量OFS(output fieldseparator)显式指定其它间隔符。类似的多个记录之间也可以指定默认的换行符之外的其它字符串。

awk  ‘BEGIN {OFS = “;”; ORS=“\n\n”; OFMT = “%d” }{print $1, $2}’ datafile除了OFS,本例中ORS是记录之间的间隔符。

OFMT则是处理数字时的打印格式。但实际上,我们通常用printf来格式化打印内容。它可以为每一个分段指定宽度,指定数字的打印格式(基数、指数形式等等)。用法如下:

awk  ‘{print format item1, item2…}’

awk  ‘{print format item1, item2…}’和print不同,printf不会在打印完一条记录后自动添加换行,并且OFS和ORS将失去其作用。format的指定方式和C语言中printf函数的format用法相同。

awk  ‘{printf  “%-10s  %s\n”,  $1, $2}’    datafile

awk  ‘{printf  “%-10s  %s\n”,  $1, $2}’    datafile本例中,将分段1打印为最小宽度为10个字符的字符串,若不够则在左边补足空白符(不带-时在右边补足空白符)。然后空格后直接打印分段2。最后插入换行符后继续处理下一条记录。另外,还可以利用 >, >>和|操作符重定向print及printf的输出。例如:

awk ‘{ print $1 > “output_file_name”printf format $2 | “sort –r >> output_file_name_1”}’ datafile

  • 相关文章推荐:
  • 本文来自:
  • 本文链接:
阅读(920) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~