gawk Notes(2)
> pattern的细化
首先说下BEGIN和END之间的多个模式的执行顺序,我写了下面的程序来验证下:
图1 多个模式的执行顺序验证(数据文件为cars)
如上图,BEGIN,END中间有三个模式,缺省模式,判断出厂时间($3>2000),判断品牌($1 ~ /ford/),运行结果如下:
图2 运行结果
可见,对数据文件中的一条记录,gawk的多个文件是依次匹配的。
· pattern中用到的语法和运算符:
1、正则表达式
如图1中看到的,用 / / 将正则表达式括起来,即可将该表达式作为模式使用:
单独的“ /ford/ ” 表示用该表达式匹配整个记录
也可以至少用“ ~ ”,如“$1 ~ /ford/”,表示指定字段作为匹配对象,匹配对象可以是字段,也可以使变量。
“!~ ”表示不满足匹配。
2、关系操作符
可以使用<,<=,==,!=,>=,> 等关系操作符进行数值和字符串比较
3、布尔运算符
可以使用 ||(OR)和&&(AND)来组合任何模式
· 特殊符号
, (逗号)
范围操作符 如果一个gawk程序行上用逗号将两个模式隔开,
gawk选取从匹配第1个模式的第1行开始的文本行。
gawk选取的最后一行是匹配第2个模式的那行紧接着的下一行文本。如果没有匹配第2个模式的文本航,gawk将选取知道输入末尾的所有文本行。
在gawk找到第2个模式之后,它将再次查找第1个模式以再次开始这个过程。
eg.
图3 cars数据文件
图4 逗号算符示例1
图5 逗号算符示例2
看示例1,“awk '/volvo/,/bmw/' cars”, 先匹配/volvo/,从第4行开始,匹配成功,然后要匹配/bmw/,到第7行。然后,重新开始匹配/volvo/,找不到,到文件末尾,结束。
示例2,“awk '/chevy/,/ford/' cars”,先匹配/chevy/,从第一行开始,匹配成功,然后匹配/ford/,第一组取到2、3行数据,又从/chevy/开始,虽然cars中第5行为ford,但是现在匹配的是/chevy/,所以被跳过了。可见,逗号分隔的两个匹配,是有先后顺序的。
> 几个特殊符号
单引号'
在命令行上创建的gawk程序中间包含空格或特殊的shell字符,则必须用单引号将程序括起来。
gawk写在shell文件中时:
单引号用来从shell中获取变量值
图6 单引号示例
双引号"
使用了双引号,gawk将进行正文比较,即使用ASCII排序序列作为比较基础
图7 双引号示例
如果是进行数值比较,则不用双引号
图8 数值比较