Linux 版 (精华区)

发信人: superman (风雨无阻), 信区: Unix
标  题: ◇ gawk 手册(3)
发信站: 紫 丁 香 (Mon Jun 29 07:33:33 1998), 站内信件

【 以下文字转载自 cnlinux 讨论区 】
【 原文由 Gamble_Tan@bbs.ustc.edu.cn 所发表 】

第五章  patterns

    在 gawk 程式里面,当 pattern 符合现在的输入记录(record),其
相对应的 action 才会被执行。



  5.1 Pattern的种类

    这里对 gawk 的各种 pattern 型式作一整理:

/regular expression/
    一个 regular expression 当作一个 pattern。每当输入记录 (
    record)含有 regular expression 就视为符合。

expression
    一个单一的 expression。当一个值不为 0 或一个字串不是空的,
    则可视为符合。

pat1,pat2
    一对的 patterns 以逗号分开,指定记录的□围。

BEGIN
END
    这是特别的 pattern, gawk 在开始执行或要结束时会分别执行相
    对应於BEGIN或END的 action。

null
    这是一个空的pattern,对於每个输入记录皆视为符合pattern。



  5.2 Regular Expressions当作Patterns

    一个 regular expression 可简写为 regexp,是一种描述字串的方
法。一个 regular expression 以斜线('/')包围当作 gawk 的 pattern。

    如果输入记录含有 regexp 就视为符合。例如:pattern 为 /foo/,
对於任何输入记录含有'foo'则视为符合。

    下面的例子会将含有'foo'的输入记录之第2个栏位印出。

        gawk '/foo/ {print $2}' BBS-list

    结果如下:
555-1234
555-6699
555-6480
555-2127

    regexp 也能使用在比较的算式。

exp ~ /regexp/
    如果 exp 符合 regexp,则结果为真(true)。

exp !~ /regexp/
    如果 exp 不符合 regexp,则结果为真。



  5.3 比较的算式当作Patterns

    比较的 pattern 用来测试两个数字或字串的关系诸如大於、等於
、小於。下面列出一些比较的pattern:

x<y   如果 x 小於 y,则结果为真。
x<=y  如果 x 小於、等於 y,则结果为真。
x>y   如果 x 大於 y,则结果为真。
x>=y  如果 x 大於、等於 y,则结果为真。
x==y  如果 x 等於 y,则结果为真。
x!=y  如果 x 不等於 y,则结果为真。
x~y   如果 x 符合 regular expression y,则结果为真。
x!~y  如果 x 不符合 regular expression y,则结果为真。

    上面所提到的 x 与 y,如果二者皆是数字则视为数字之间的比较,
否则它们会被转换成字串且以字串的形式做比较。两个字串的比较,
会先比较第一个字元,然後比较第二个字元,依此类推,直到有不同
的地方出现为止。如果两个字串在较短的一个结束之前是相等,则视
为长的字串比短的字串大。例如 "10" 比 "9" 小,"abc" 比 "abcd" 小。



  5.4 使用布林运算的Patterns

    一个布林(boolean) pattern 是使用布林运算"或"('||'),"及"
('&&'),"反"('!')来组合其它的pattern。
例如:

    gawk '/2400/ && /foo/' BBS-list
    gawk '/2400/ || /foo/' BBS-list
    gawk '! /foo/' BBS-list


第六章  算式(Expression)作为Actions的叙述

    算式(Expression) 是gawk程式里面action的基本构成者。



  6.1 算术运算

    gawk 里的算术运算如下所示:

x+y  加
x-y  减
-x   负
+x   正。实际上没有任何影响。
x*y  乘
x/y  除
x%y  求馀数。例如 5%3=2。
x^y
x**y x 的 y 次方。例如2^3=8。

  6.2 比较算式与布林算式

    比较算式 (comparison expression) 用来比较字串或数字的关系
,运算符号与 C 语言相同。表列如下:

x<y
x<=y
x>y
x>=y
x==y
x!=y
x~y
x!~y

比较的结果为真(true)则其值是 1。否则其值是 0。

    布林算式(boolean expression)有下面三种:

boolean1 && boolean2
boolean1 || boolean2
! boolean


  6.3 条件算式(Conditional Expressions)

    一个条件式算式是一种特别的算式,它含有3个运算元。
    条件式算式与C语言的相同:

        selector ? if-true-exp : if-false-exp

它有3个子算式。第一个子算式selector 首先会被计算。如果是真,
则if-true-exp会被计算且它的值变成整个算式的值。否则if-false-
exp 会被计算且它的值变成整个算式的值。

    例如下面的例子会产生x的绝对值:

        x>0 ? x : -x



第七章  Actions里面的控制叙述

    在 gawk 程式里面,控制叙述诸如 if、while 等控制程式执行的流
程。在 gawk 里的控制叙述与 C 的类似。

    很多的控制叙述会包括其它的叙述,被包括的叙述称为 body。假
如 body 里面包括一个以上的叙述,必须以大括弧 { } 将这些叙述括起
来,而各个叙述之间需以换行(newline)或分号隔开。



  7.1 if 叙述

        if (condition) then-body [else else-body]

如果 condition 为真(true),则执行 then-body,否则执行 else-body。

    举一个例子如下:

        if (x % 2 == 0)
           print "x is even"
        else
           print "x is odd"



  7.2 while 叙述

        while (condition)
           body

while 叙述做的第一件事就是测试 condition。假如 condition 为真则
执行 body 的叙述。body 的叙述执行完後,会再测试 condition,假如
condition 为真,则 body 会再度被执行。这个过程会一直被重复直到
condition 不再是真。如果 condition 第一次测试就是伪(false),则
body 从没有被执行。

    下面的例子会印出每个输入记录(record)的前三个栏位。

        gawk '{ i=1
                while (i <= 3) {
                    print $i
                    i++
                }
              }'



 7.3 do-while 叙述

        do
           body
        while (condition)

这个 do loop 执行 body 一次,然後只要 condition 是真则会重复执行 body。
即使开始时 condition 是伪,body 也会被执行一次。

    下面的例子会印出每个输入记录十次。

        gawk '{ i= 1
                do {
                   print $0
                   i++
                } while (i <= 10)
        }'



  7.4 for 叙述

        for (initialization; condition; increment)
           body

此叙述开始时会执行initialization,然後只要 condition是真,它
会重复执行body与做increment 。

    下面的例子会印出每个输入记录的前三个栏位。

        gawk '{ for (i=1; i<=3; i++)
                   print $i
        }'



  7.5 break 叙述

    break 叙述会跳出包含它的 for、while、do-while 回圈的最内层。

    下面的例子会找出任何整数的最小除数,它也会判断是否为质数。

        gawk '# find smallest divisor of num
             { num=$1
               for (div=2; div*div <=num; div++)
                  if (num % div == 0)
                    break
               if (num % div == 0)
                  printf "Smallest divisor of %d is %d\n", num, div
               else
                  printf "%d is prime\n", num }'



  7.6 continue 叙述

    continue 叙述使用於 for、while、do-while 回圈内部,它会跳
过回圈 body 的剩馀部分,使得它立刻进行下一次回圈的执行。

    下面的例子会印出 0 至 20 的全部数字,但是 5 并不会被印出。

        gawk 'BEGIN {
             for (x=0; x<=20; x++) {
                if (x==5)
                   continue
                printf ("%d",x)
             }
             print ""
        }'



  7.7 next 叙述、next file 叙述、exit 叙述

    next 叙述强迫 gawk 立刻停止处理目前的记录(record)而继续下一
个记录。

    next file 叙述类似 next。然而,它强迫 gawk 立刻停止处理目前
的资料档。

    exit 叙述会使得 gawk 程式停止执行而跳出。然而,如果 END 出现
,它会去执行 END 的 actions。



第八章  内建函式(Built-in Functions)

    内建函式是 gawk 内建的函式,可在 gawk 程式的任何地方呼叫内建
函式。



  8.1 数值方面的内建函式

int(x)      求出 x 的整数部份,朝向 0 的方向做舍去。例如:int(3.9)
            是 3,int(-3.9) 是 -3。
sqrt(x)     求出 x 正的平方根值。例 sqrt(4)=2
exp(x)      求出 x 的次方。例 exp(2) 即是求 e*e 。
log(x)      求出 x 的自然对数。
sin(x)      求出 x 的 sine 值,x 是弪度量。
cos(x)      求出 x 的 cosine 值,x 是弪度量。
atan2(y,x)  求 y/x 的 arctangent 值,所求出的值其单位是弪度量。
rand()      得出一个乱数值。此乱数值平均分布在 0 和 1 之间。这个
            值不会是 0,也不会是 1。
            每次执行 gawk,rand 开始产生数字从相同点或 seed。
srand(x)    设定产生乱数的开始点或 seed 为 x。如果在第二次你设
            定相同的 seed 值,你将再度得到相同序列的乱数值。
            如果省略引数 x,例如 srand(),则现在的日期、时间会
            被当成 seed。这个方法可使得乱数值是真正不可预测的。
            srand 的传回值(return value)是前次所设定的 seed 值。



  8.2 字串方面的内建函式

index(in, find)
    它会在字串 in 里面,寻找字串 find 第一次出现的地方,传回值是
    字串 find 出现在字串 in 里面的位置。如果在字串 in 里面找不到字
    串 find,则传回值为 0。
    例如:
        print index("peanut","an")
    会印出 3。

length(string)
    求出 string 有几个字元。
    例如:
        length("abcde")
    是 5。

match(string,regexp)
    match 函式会在字串 string 里面,寻找符合 regexp 的最长、最靠
    左边的子字串。传回值是 regexp 在 string 的开始位置,即 index
    值。
    match 函式会设定内在变数 RSTART 等於 index,它也会设定内在变
    数 RLENGTH 等於符合的字元个数。如果不符合,则会设定 RSTART 为
    0、RLENGTH 为 -1。

sprintf(format,expression1,...)
    举 printf 类似,但是 sprintf 并不印出,而是传回字串。
    例如:
        sprintf("pi = %.2f (approx.)',22/7)
    传回的字串为"pi = 3.14 (approx.)"

sub(regexp, replacement,target)
    在字串 target 里面,寻找符合 regexp 的最长、最靠左边的地方,
    以字串 replacement 代替最左边的 regexp。
    例如:
        str = "water, water, everywhere"
        sub(/at/, "ith",str)
    结果字串str会变成
    "wither, water, everywhere"

gsub(regexp, replacement, target)
    gsub 与前面的 sub 类似。在字串 target 里面,寻找符合 regexp 的
    所有地方,以字串 replacement 代替所有的 regexp。
    例如:
        str="water, water, everywhere"
        gsub(/at/, "ith",str)
    结果字串str会变成
    'wither, wither, everywhere"

substr(string, start, length)
    传回字串 string 的子字串,这个子字串的长度为 length 个字元,
    从第 start 个位置开始。
    例如:
      substr("washington",5,3)
    传回值为"ing"
    如果 length 没有出现,则传回的子字串是从第 start 个位置开始
    至结束。
    例如:
        substr("washington",5)
    传回值为"ington"

tolower(string)
    将字串string的大写字母改为小写字母。
    例如:
        tolower("MiXeD cAsE 123")
    传回值为"mixed case 123"

toupper(string)
    将字串string的小写字母改为大写字母。
    例如:
        toupper("MiXeD cAsE 123")
    传回值为"MIXED CASE 123"



  8.3 输入输出的内建函式

close(filename)
    将输入或输出的档案 filename 关闭。

system(command)
    此函式允许使用者执行作业系统的指令,执行完毕後将回到 gawk
    程式。
    例如:
        BEGIN {system("ls")}

--
※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: poster.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:207.764毫秒