您的位置:首页 > 其它

awk的使用 第二部分 awk的运行方式

2013-10-15 09:40 337 查看
在linux/UNIX 的命令行上输入一下格式的指令: ( “$”表Shell命令行上 的提示符号)

    $awk   ‘awk程序’   数据文件名

    上面这条语句中,awk会先编译该程序, 然后执行该程序来处理所指定的数据文件。

    awk程序的主要结构: awk程序中主要语法是 Pattern { Actions},即模式{动作}, 所以常见的awk 程序的机构如下:

    Pattern1 { Actions1 }

    Pattern2 { Actions2 }

    ……

    Pattern3 { Actions3 }

    Pattern 是什么? awk 可接受许多不同型态的Pattern。 一般常使用 “关系表达式”(Relational expression) 来当成 Pattern。 例如: x > 34 是一个Pattern, 判断变x与34是否存在大于的关系。 x == y是一个Pattern, 判断变量x与变量y是否存在等于的关系。 上式中 x>34 ,x ==y 便是典型的Pattern。 awk 提供C 语言中常见的关系运算符(Relational Operators) 如 >, <, >=, <=,
==, != 。此外, awk 还提供~ (匹配match) 及 !~(非匹配not match) 二个关系运算符。 其用法与涵义如下:

    如果A 为一字符串, B 为一正则表达式(Regular Expression) ,A ~ B 判断字符串A 中是否包含能匹配(match)B表达式的子字符串。 A !~ B 判断字符串A 中是否不包含能匹配(match)B表达式的子字符串。 例如:”banana” ~ /an/ 整个是一个Pattern。 因为”banana”中含有可以匹配/an/的子字符串,所以此关系式成立  (true),整个Pattern的值为true。

     有少数awk文章, 把~, !~ 当成另一类的操作符(Operator),而不作为一种 Relational Operator。在这里将这两个运算符当成一种Relational Operator。  

    Actions 是什么?

    Actions 是由许多awk指令构成。awk 的指令与C 语言中的指令十分类似。 例如:awk 的I/O指令: print, printf( ), getline……

    awk的流程控制指令:

     if(…){…} else{…}, while(…){…}…

     awk 如何处理模式和动作的呢?(Pattern { Actions } ? ),awk 会先判断(Evaluate)Pattern的值, 如果Pattern的值为true (或不为0的数字,或不是空的字符串),则awk将执行该Pattern所对应的Actions。否则,如果Pattern之值不为true, 则awk 将不执行该Pattern所对应的Actions。

    例如:如果awk程序中有下列两指令 50 > 23 {print “Hello! The word!!” } “banana” ~ /123/ { print “Good morning !” }

    awk会先判断50 >23 是否成立,因为该式成立,所以awk将打印出”Hello! The word!!”。 而另一Pattern 为”banana” ~/123/, 因为”banana” 内未含有任何子字符串可匹配(match)/123/,所以Pattern 的值是false,awk将不会打印出 “Good morning !”  

     awk 如何处理{ Actions } 的语法是什么呢?

    有时语法Pattern { Actions }中,Pattern 部分会省略,只剩下 {Actions}。这种情况表示”无条件执行这个Actions”。  

 

awk 的字段变量
    awk 所内建的字段变量及其涵意如下:

    字段变量     含义

    $0                一字符串, 其内容为目前awk 所读入的数据行。

     $1               $0 上第一个字段的数据。

    $2                $0 上第二个字段的数据

    其余类推 。

    读入数据行时,awk如何更新(update)这些内建的字段变量?

    当awk 从数据文件中读取一个数据行时,awk 会使用内建变量$0 进行记录。当$0 被改动时(例如:读入新的数据行或改变$0的值…), awk 会立刻重新分析$0的字段情况,并将$0上各字段的数据用$1,$2…进行记录。  

     awk 的内建变量(Built-in Variables)

    awk 提供了许多内建变量,使用者可以在程序中使用这些变量来取得相关信息。常见的内建变量有:

    内建变量                   含义

    NF                               Number of Fields 为一整数,其值表示$0上所存在的字段数目。

    NR                               Number of Records为一整数,其值表示awk 已读入的数据行数目。 

    FILENAME             awk正在处理的数据文件文件名。

    例如:awk 从资料文件emp.dat 中读入第一笔数据行“A101 chenying 100 210”之后,程序中:$0 的值就是“A101 chenying 100 210”,$1的值是 “A101″,$2 的值是 “chenying”,$3的值是100,$4的值是210,$NF的值是4,$NR 的值是1,$FILENAME 的值是”emp.dat”。

     awk 的工作流程:执行awk 时,它会反复进行下列四步骤:

     1、自动从指定的数据文件中读取一个数据行。   

     2、自动更新(Update)相关的内建变量之值。 如:NF,NR,$0…

    3、依次执行程序中所有的Pattern { Actions } 指令。   

    4、当执行完程序中所有Pattern { Actions } 时,如果数据文件中还有未读取的数据,则反复执行步骤1到步骤4。awk会自动重复进行上述4个步骤,使用者不须于程序中编写这个循环(Loop)。  

打印文件中指定的字段数据并加以计算

    awk 处理数据时,它会自动从数据文件中一次读取一行记录,并将该数据切分成一个个的字段;程序中可使用$1,$2,…直接取得各个字段的内容。这个特色让使用者轻易地使用awk 编写reformatter 来改变数据格式。

    例子:以文件emp.dat 为例,计算每人应发工资并打印报表。

     分析:awk 会自行一次读入一行数据,所以程序中仅需告诉awk 如何处理所读入的数据行。执行如下命令:

    $ awk  ‘{ print $2,$3 * $4 }’  emp.dat

    执行结果时,屏幕出现 :

    chenying      21000

    linxiyu          23650

     …………….

    linux/UNIX命令行上,执行awk 的语法为:$awk  ’awk程序’  欲处理的资料文件文件名;本例中程序部分是{print $2, $3 * $4}。 把程序置于命令行时,程序之前后须以’ 括住。emp.dat 为指定给该程序处理的数据文件文件名。本程序中使用:Pattern { Actions } 语法,但是Pattern 部分被省略,表无任何限制条件,所以awk读入每笔数据行后都将无条件执行这个Actions。 print为awk所提供的输出指令,会将数据输出到标准输出stdout(屏幕)。
print 的参数间彼此以”,” (逗号) 隔开,打印出数据时彼此间会以空白隔开。

    如果将上述的程序部分储存于文件pay1.awk 中,执行命令时再指定awk 程序文件的文件名。 这是执行awk 的另一种方式,适用于程序较大的情况, 其语法如下:

    $ awk   -f   awk程序文件名  数据文件文件名 

    $ awk -f pay1.awk emp.dat 

   

    awk 中也提供与 C 语言中类似用法的printf()函数,使用该函数可进一步控制数据的输出格式。编辑另一个awk程序如下,并取名为pay2.awk  

    { printf(“%10s Work hours: %3d Pay: %5d/n”, $2,$3, $3* $4) }  

    执行下列命令      

    $awk -f  pay2.awk  emp.dat      

    执行结果屏幕出现:    

  chenying Workhours: 100 and pay: 21000

   linxiyu Workhours: 110 and pay: 23650

  degnming Workhours: 130 and pay: 27170

   liuchao Workhours: 125 and pay: 27500

    hejing Workhours: 95 and pay: 19950
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: