Chinaunix首页 | 论坛 | 博客
  • 博客访问: 585524
  • 博文数量: 151
  • 博客积分: 3330
  • 博客等级: 中校
  • 技术积分: 1686
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-08 02:41
文章存档

2011年(151)

分类: LINUX

2011-04-26 02:27:08

AWK是一种用于处理数据和生成报告的UNIX编程语言。 nawk 是awk的新版本。 gawk 是基于linux 的GNU版本。

处理的数据可以来自标准输入,一个或多个文件,也可以来自程序的输出。

awk 以逐行方式扫描文件或输入,从第一行到最后一行,以查找匹配某个特定模式的问本行,并对这些文本行执行指定的动作。

awk 指令有模式,操作,或模式和操作的组合组成。
awk 有awk命令,括在引号中的程序指令,输入文件的文件名组成。


awk 工作原理

以一个名为names的文件为例进行说明

cat names 

tom savage 100
molly lee 200
john doe 300

以上为names的内容

执行如下指令:
nawk '{print $1,$3}' names

1.awk 使用一行作为输入,并将这一行付给内部变量$0,默认时每一行也可以称为一个记录,以换行符结束。
    tom  savage 100 
        $0

2.然后,行被空格分解成字段(单词),每个字段存储在已编号的变量中,从$1开始,可以多达100个字段

     tom  savage  100
     $1    $2      $3

3. awk 通过内部变量FS用来确定字段分隔符。初始时,FS被赋予为空格---包含制表符和空格符。
   如果需要使用其他分隔符,需要将FS变量的值设置新的字段分隔符

4. awk 打印字段时,将以下面的方式使用print 函数
   {print $1,$3}
   
    tom 100
    molly 200
    john 300

awk在tom 和 100 之间加入了空格,因为$1,$3之间存在一个逗号。
逗号被影射为另一个特殊的内部变量,OFS(输出字段分隔符)
OFS默认为空格。

5. awk输出之后,将从文件中获取另一行,并将其存在$0中,覆盖原来的内容,重新分割成字段并进行处理。知道完成所有行。


OFMT 变量
OFMT变量的默认值是 "%.6gd" ,表示只打印小数部分的前6位。

ORS 输出记录分隔符  默认 是回车符
RS 记录分隔符
NF 字段数
FS 字段分隔符  ,awk  使用空格或制表符来分割字段
NR 记录号,每条记录的记录号。
OFS 输出字段分隔符 ,默认是 单个空格
$NF  表示最后一个字段


举例

nawk '$0 ~ /Tom/{print $0}' datafile

nawk '$3 < 4000' datafile
打印第三个字段小于4000 的行

nawk -F: '/tom/{print $0}' datafile

nawk -F'[ :\t]' '{print $1,$2,$3}' datafile 
指定空格,冒号,制表符作为分隔符


匹配操作符  ~

nawk '$1 ~ /[Bb]ill/' datafile
打印所有在第一个字段里面匹配到 Bill 或bill 的行

nawk '$1 !~ /ly$/' datafile
打印所有第一个字段不是以ly结尾的行

nawk '/^north/' datafile
打印所有以模式north 开头的行

nawk '/^(no|so)/' datafile
打印所有以模式no 或者 so开头的行

nawk '{print $1,$2,$3}' datafile
打印第1,2,3个字段,逗号被转换为OFS的值,

nawk '{print "the number of fields:" NF}' datafile
打印所有记录的字段数

nawk '$8 ~ /[0-9][0-9]$/{print $8}' datafile
如过第八个字段以两个数字结尾,就打印该字段




阅读(1431) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~