【译】 AWK教程指南 附录A-Patterns

  awk 通过判断 Pattern
的值来决定是否执行其后所对应的Actions。这里列出几种常见的Pattern:

A.1 BEGIN

  BEGIN 为 awk 的保留字,是一种特殊的 Pattern。

  BEGIN 成立(其值为true)的时机是:

    "awk 程序一开始执行,尚未读取任何数据之前。"

  所以在 BEGIN { Actions } 语法中,其 Actions
部份仅于程序一开始执行时被执行一次。当 awk 从数据文件读入数据行后, BEGIN 便不再成立,故不论有多少数据行,该 Actions
部份仅被执行一次。

  一般常把 "与数据文件内容无关" 与 "只需执行一次" 的部分置于该Actions(以
BEGIN 为 Pattern)中。

例如:


    BEGIN {
      FS = "[ \t:]" # 于程序一开始时, 改变awk切割字段的方式
      RS = ""    # 于程序一开始时, 改变awk分隔数据行的方式
      count = 100 # 设定变量 count 的起始值
      print " This is a title line " # 印出一行 title
    }
    .......
    # 其它 Pattern { Actions }
    .....

  有些awk程序甚至"不需要读入任何数据行"。遇到这情况可把整个程序置于以
BEGIN 为 Pattern的 Actions 中。

例如:


    BEGIN { print " Hello ! the Word ! " }

注意:执行该类仅含 BEGIN { Actions }
的程序时,awk 并不会开启任何数据文件进行处理。

A.2 END

  END 为 awk 的保留字,是另一种特殊的 Pattern。

  END 成立(其值为true)的时机与 BEGIN 恰好相反,为:

    "awk 处理完所有数据,即将离开程序时"

  平常读入数据行时,END并不成立,故其对应的 Actions
并不被执行;唯有当awk读完所有数据时,该 Actions 才会被执行。

注意:不管数据有多少行,该 Actions 仅被执行一次。

A.3 关系表达式

  使用像 " A 关系运算符 B" 的表达式当成 Pattern。

  当 A 与 B 存在所指定的关系(Relation)时,该 Pattern
就算成立(true)。

例如:


    length($0) <= 80 { print $0 }

  上式中 length($0) <= 80
是一个 Pattern,当 $0(数据行)的长度小于等于80时该 Pattern 的值为true,将执行其后的 Action
(打印该行数据)。

  awk
中提供下列 关系运算符(Relation Operator)





























运算符 含意
> 大于
< 小于
>= 大于或等于
<= 小于或等于
== 等于
!= 不等于
~ match
!~ not
match

  上列关系运算符除~(match)与!~(not match)外,与 C
语言中的含意一致。

  ~(match) 与!~(match) 在 awk
的含意简述如下:

  若 A 为一字符串,B
为一正则表达式

  • A ~  B 判断 字符串A 中是否 包含  
     能匹配(match)B式样的子字符串。

  • A !~ B 判断 字符串A 中是否 未包含
    能匹配(match)B式样的子字符串。

例如:  


    $0 ~ /program[0-9]+\.c/ { print $0 }

  $0 ~ /program[0-9]+\.c/
整个是一个 Pattern,用来判断$0(数据行)中是否含有可 match  /program[0-9]+\.c/ 的子字符串,若$0
中含有该类字符串,则执行 print (打印该行数据)。

  Pattern 中被用来比对的字符串为$0
时(如本例),可仅以正则表达式部分表示整个Pattern。故本例的 Pattern 部分$0
~/program[0-9]+\.c/ 可仅用/program[0-9]+\.c/表之(有关匹配及正则表达式请参考 附录 E )

A.4 正则表达式

  直接使用正则表达式当成 Pattern,此为 $0 ~ 正则表达式
的简写。

  该 Pattern 用以判断 $0(数据行)
中是否含有匹配该正则表达式的子字符串,若含有,该式成立(true),则执行其对应的 Actions。

例如:


    /^[0-9]*$/ { print "This line is an integer !" }


    $0 ~ /^[0-9]*$/ { print "This line is an integer !" }

相同。

A.5 混合Pattern

  之前所介绍的各种 Patterns,其计算后结果为一逻辑值(True or
False)。awk 中逻辑值彼此间可通过&&(and)、||(or)、!(not) 结合成一个新的逻辑值。故不同 Patterns
彼此可通过上述结合符号来结合成一个新的 Pattern。如此可进行复杂的条件判断。

例如:


    FNR >= 23 && FNR <= 28 { print "     " $0 }

  上式利用&& (and) 将两个 Pattern
求值的结果合并成一个逻辑值。该式将数据文件中 第23行 到 28行
向右移5格(先输出5个空白字符)后输出。( FNR 为awk的内置变量, 请参考
附录 D )

A.6 Pattern1, Pattern2

  遇到这种 Pattern(笔者注:逗号表达式),awk 会帮您设立一个
switch(或flag)。

  •  当awk读入的数据行使得 Pattern1 成立时,awk 会打开(turn
    on)这个 switch

  •  当awk读入的数据行使得 Pattern2 成立时,awk 会关上(turn
    off)这个 switch

  该 Pattern 成立的条件是:

    当这个 switch 被打开(turn on)时
(包括 Pattern1 或 Pattern2 成立的情况)

例 如:


    FNR >= 23 && FNR <= 28 { print "     " $0 }

可改写为


    FNR == 23 , FNR == 28 { print "     " $0 }

说 明:

  当 FNR >= 23 时,awk 就 turn on 这个
switch;因为随着数据行的读入,awk不停的累加 FNR。当 FNR = 28 时,Pattern2 (FNR == 28) 便成立,这时 awk
会关上这个 switch。

  当 switch 打开的期间,awk 会执行  print
"     " $0

  ( FNR 为awk的内置变量, 请参考 附录 D )

【译】 AWK教程指南 附录A-Patterns,布布扣,bubuko.com

时间: 2024-10-07 10:38:53

【译】 AWK教程指南 附录A-Patterns的相关文章

【译】 AWK教程指南 附录E-正则表达式

为什么要使用正则表达式 UNIX 中提供了许多 指令 和 tools,它们具有在文件中 查找(Search)字串或替换(Replace)字串 的功能.像 grep, vi , sed, awk,... 不论是查找字串或替换字串,都得先告诉这些指令所要查找(被替换)的字串为何.若未能预先明确知道所要查找(被替换)的字串为何,只知该字串存在的范围或特征时,例如: (一)查找 "T0.c", "T1.c", "T2.c".... "T9.c&

【译】 AWK教程指南 附录B-Actions

Actions 是由下列指令(statement)所组成: 1 表达式 ( 函数调用,赋值...) 2 print 表达式列表 3 printf( 格式化字符串, 表达式列表) 4 if( 表达式 ) 语句 [else 语句] 5 while( 表达式 ) 语句 6 do 语句 while( 表达式) 7 for( 表达式; 表达式; 表达式) 语句 8 for( variable in array) 语句 9 delete 10 break 11 continue 12 next 13 exi

【译】 AWK教程指南 附录D-AWK的内置变量

因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列. ARGC ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程序"直接写在命令列上,则 ARGC 亦不将该"程序部分"列入计算. ARGV ARGV数组用以记录命令列上的参数. 例:执行下列命令 $ awk -F\t -v a=8 -f prg.awk file1.dat file2.dat 或 $ awk -F\t -v a=8 '{ prin

【译】 AWK教程指南 2概述

2.1 为什么用AWK 由于awk具有上述特色,在问题处理的过程中,可轻易使用awk来撰写一些小工具:这些小工具并非用来解决整个大问题,它们只扮演解决个别问题过程的某些角色,可通过Shell所提供的pipe将数据按需要传送给不同的小工具进行处理,以解决整个大问题.这种解题方式,使得这些小工具可因不同需求而被重复组合及使用(reuse):也可通过这种方式来先行测试大程序原型的可行性与正确性,将来若需要较高的执行速度时再用C语言来改写.这是awk最常被应用之处.若能常常如此处理问题,读者可以以更高的

【译】 AWK教程指南 4通过文本内容和对比选择指定的记录

Pattern { Action }为awk中最主要的语法.若某Pattern的值为真则执行它后面的 Action. awk中常使用"关系表达式" (Relational Expression)来当成 Pattern. awk 中除了>, <, ==, != ,...等关系运算符( Relational Operators )外,另外提供 ~(match),!~(Not Match) 二个关系运算符.利用这两个运算符,可判断某字符串是否包含能匹配所指定正则表达式的子字符串.

【译】 AWK教程指南 3计算并打印文件中指定的字段数据

awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reformatter 来改变数据格式. 范例:以数据文件 emp.dat 为例,计算每人应发工资并打印报表. 分析:awk 会自行一次读入一条记录,故程序中仅需告诉 awk 如何处理所读入的数据行. 执行如下命令:($ 表UNIX命令行上的提示符)  $ awk '{ print $2, $3 * $4 }'

【译】 AWK教程指南 1前言

前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统计总大小的文件mv过去,然后du或者ls -lh新目录.诚然,这个办法又笨又不精确,于是求助万能的网络,找到的都是同一篇用了3个很长的循环来统计的脚本,还是自己先苦读"经书"吧.鸟哥的书第十二章就有现成的示例,就用到了马上要出场的awk工具,用法如下(统计目录下所有tmp*文件的总大小,以

【译】 AWK教程指南 5AWK中的数组

awk程序中允许使用字符串当做数组的下标(index).利用这个特色十分有助于资料统计工作.(使用字符串当下标的数组称为Associative Array) 首先建立一个数据文件,并取名为 reg.dat.此为一学生注册的资料文件:第一栏为学生姓名,其后为该生所修课程. awk中数组的特性 1. 使用字符串当数组的下标(index). 2. 使用数组前不须声明数组名及其大小. 例如:希望用数组来记录 reg.dat 中各门课程的修课人数.这情况,有两项信息必须储存: (a) 课程名称,如: "O

【译】 AWK教程指南 8处理多行数据

awk 每次从数据文件中只读取一行数据进行处理.awk是依照其内置变量 RS(Record Separator) 的定义将文件中的数据分隔成一行一行的Record.RS 的默认值是 "\n"(换行符),故平常awk中一行数据就是一条 Record. 但有些文件中一条Record涵盖了多行数据,这种情况下不能再以 "\n" 来分隔Records.最常使用的方法是相邻的Records之间改以 一个空白行 来隔开. 在awk程序中,令 RS = ""(