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]
(p30 of
如果 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。
(p32 of
即使开始时 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 叙述
(p34 of 46)
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。
(p36 of 46)
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)
(p37 of 46)
它会在字串 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。
(p38 of 46)
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。
例如:
(p39 of 46)
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\")}
第九章 使用者定义的函式(User-defined Functions)
复杂的 gawk 程式常常可以使用自己定义的函式来简化。呼叫使用
者定义的函式与呼叫内建函式的方法一样。
9.1 函式定义的格式
函式的定义可以放在 gawk 程式的任何地方。
一个使用者定义的函式其格式如下:
function name (parameter-list) {
body-of-function
}
name 是所定义的函式之名称。一个正确的函式名称可包括一序列的字
母、数字、下标线 (underscores),但是不可用数字做开头。
parameter-list 是列出函式的全部引数(argument),各个引数之
间以逗点隔开。
body-of-function 包含 gawk 的叙述 (statement)。它是函式定义
里最重要的部份,它决定函式实际要做何种事。
9.2 函式定义的例子
下面这个例子,会将每个记录的第一个栏位之值的平方与第二个
栏位之值的平方加起来。
{print \"sum =\",SquareSum($1,$2)}
function SquareSum(x,y) {
sum=x*x+y*y
return sum
}
第十章 □例
这里将列出 gawk 程式的一些例子。
gawk \{if (NF > max) max = NF}
END {print max}\
此程式会印出所有输入行之中,栏位的最大个数。
gawk \length($0) > 80\
此程式会印出一行超过 80 个字元的每一行。此处只有 pattern 被
列出,action 是采用内定的 print。
gawk \NF > 0\
对於拥有至少一个栏位的所有行,此程式皆会印出。这是一个简
单的方法,将一个档案里的所有空白行删除。
gawk \{if (NF > 0) print}\
对於拥有至少一个栏位的所有行,此程式皆会印出。这是一个简
单的方法,将一个档案里的所有空白行删除。
gawk \BEGIN {for (i = 1; i <= 7; i++)
print int(101 * rand())}\
此程式会印出□围是 0 到 100 之间的 7 个乱数值。
ls -l files | gawk \{x += $4}; END {print \"total bytes: \" x}\
此程式会印出所有指定的档案之bytes数目的总和。
expand file | gawk \{if (x < length()) x = length()}
END {print \"maximum line length is \" x}\
此程式会将指定档案里最长一行的长度印出。expand 会将 tab 改
成 space,所以是用实际的右边界来做长度的比较。
gawk \BEGIN {FS = \":\"}
{print $1 | \"sort\"}\ /etc/passwd
此程式会将所有使用者的login名称,依照字母的顺序印出
gawk \{nlines++}
END {print nlines}\
此程式会将一个档案的总行数印出。
gawk \END {print NR}\
此程式也会将一个档案的总行数印出,但是计算行数的工作由gawk
来做。
gawk \{print NR,$0}\
此程式印出档案的内容时,会在每行的最前面印出行号,它的功
能与 \cat -n\ 类似。
第十一章 结论
gawk 对於资料的处理具有很强的功能。它能够以很短的程式完成
想要做的事,甚至一或二行的程式就能完成指定的工作。同样的一件
工作,以 gawk 程式来写会比用其它程式语言来写短很多。
gawk 是 GNU 所做的 awk,它是公众软体(Public Domain) 可免费使
用。
发布人:netbull 来自:歪歪鱼的Linux世界