【转】你不了解的awk

pattern的细化

首先说下BEGIN和END之间的多个模式的执行顺序,我写了下面的程序来验证下:

  1. image

图1 多个模式的执行顺序验证(数据文件为cars)

如上图,BEGIN,END中间有三个模式,缺省模式,判断出厂时间($3>2000),判断品牌($1 ~ /ford/),运行结果如下:

image

图2 运行结果

可见,对数据文件中的一条记录,gawk的多个文件是依次匹配的。

· pattern中用到的语法和运算符:

1、正则表达式

如图1中看到的,用 / / 将正则表达式括起来,即可将该表达式作为模式使用:

单独的“ /ford/ ” 表示用该表达式匹配整个记录

也可以至少用“ ~ ”,如“$1 ~ /ford/”,表示指定字段作为匹配对象,匹配对象可以是字段,也可以使变量。

“!~ ”表示不满足匹配。

2、关系操作符

可以使用<,<=,==,!=,>=,> 等关系操作符进行数值和字符串比较

3、布尔运算符

可以使用 ||(OR)和&&(AND)来组合任何模式

· 特殊符号

(逗号)

范围操作符 如果一个gawk程序行上用逗号将两个模式隔开,

gawk选取从匹配第1个模式的第1行开始的文本行。

gawk选取的最后一行是匹配第2个模式的那行紧接着的下一行文本。如果没有匹配第2个模式的文本航,gawk将选取知道输入末尾的所有文本行。

在gawk找到第2个模式之后,它将再次查找第1个模式以再次开始这个过程。

eg.

image

图3 cars数据文件

image

图4 逗号算符示例1

image

图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中获取变量值

image

image

图6 单引号示例

双引号"

使用了双引号,gawk将进行正文比较,即使用ASCII排序序列作为比较基础

image

图7 双引号示例

如果是进行数值比较,则不用双引号

image

图8 数值比较

posted @ 2013-01-05 15:10  pmars  阅读(331)  评论(0编辑  收藏  举报