12 - 03 - 13 awk 笔记

awk将文件视为一系列记录的集合,记录由RS分隔开;每一个记录中包含几个域(字段),域由FS分隔开;它的工作就是对记录进行处理,达到文件尾部是结束,通常会和 shell 脚本结合使用。

常见的用法:

awk (set build-in argumen)  '{ action }' myfile

awk -f progfile myfile


内置变量:

FS:field separator,域分隔符,默认为空格;

RS:record separator,记录分隔符,默认为换行;

NR:number of record,已经找到的记录数,是个逐渐递增的量;

FNR:******,当前所处于的记录号;

NF:number of field,记录中的域的数目;

FILENAME:文件名,不解释;

OFS:FS for output,输出时用的域分隔符,默认空格;

ORS:RS for output,输出时用的记录分隔符,默认换行;

ARGC:类似C语言,参数的数目

ARGV:参数元组;


语法与内置函数:

awk 中使用 $1 对应第一个域,$2 对应第二个。。。。。$0  对应一个记录;

有不少内置函数:

print $1,$2: 打印 $1 和 $2 ,使用 OFS 分隔;

printf "%s+%s", $1, $2:类似与 C 中 printf的用法,不过格式基本上都是字符串;

if else / while / do while / for :和C中的用法基本一致;

break / continue :和 C 中的用法基本一致;

awk中可以使用数组,下标从 1 开始,但实际上 awk 是将数组下标当成字符串来处理的(参考 http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-2/index.html),这样的话,感觉就类似与 python 的 dict 了,数组被赋值是建立,数组和 for 结合,有一种比较特别的用法:


array[1] = "a"
array[2] = "b"
array[500] = "c"
array["x"] = "x"
for(i in array){
     print array[i]
}
in 用来判断是否在数组中,感觉也类似与Python,虽然awk年头比Python久远;
delete 用来删除数组元素;
next:中断当前记录的处理,进入下一个记录;
length($1):返回 $1 的长度;
index(str, substr):返回子串在 str 中出现的位置,没找到返回0;
tolower / toupper:大小写转换,将返回一个新串,而不会改变原字符串;
substr(str, startpos, maxlen):从str 的 startpos 位置,截取长maxlen的子串,如果str不够长则截断,返回新串,不改变str;
match(str, exp):类似于index,不过搜索的是表达式而非子串;
sub(exp, replacestr, str) / gsub(..):将str中符合exp的部分替换为replacestr,将修改原字符串,而上面那些函数都不会对源字符串做改动。sub 替换一次,gsub 全局替换;

awk脚本样式:
#!/bin/awk -f
BEGIN{
#set build-in argument, init variable, and so on;
}
{
#action, do sth for record in file
}
END{
#end,
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值