vislee / leevis.com

Blog
87 stars 13 forks source link

awk 教程 #4

Open vislee opened 9 years ago

vislee commented 9 years ago

awk是取自发明她的三位科学家的名字,擅长于文本处理。因最近又摊上计费这档子事情了。动不动就要给开发者查云豆消耗啊查云豆消耗。免不了要分析计费的日志。

awk 'BEGIN{ print "start" } pattern { commands } END{ print "end" }' file

也可以通过管道输入, 例如: cat file | awk 'BEGIN{ print "start" } pattern { commands } END{ print "end" }'

awk程序由三部分组成,BEGIN语句块,END语句块,能使用模式匹配的通用语句块。这三部分任何一部分都可以省略。BEGIN语句块完成一些初始化的工作,END语句块完成一些结果输出。模式匹配,逐行的读取匹配,如果匹配成功执行后面的commands

NR: 表示记录的数量(number of record),在执行过程中,相当于当前行号,是不断累加的。 NF: 表示当前行的字段数量(number of fields) $0 这个标量包含执行过程中当前行的文本内容 $1~$n 当前记录的第n个字段,字段间由FS分隔 RS 输入的记录分隔符, 默认为换行符 OFS 输出字段分隔符, 默认也是空格 ORS 输出的记录分隔符,默认为换行符 FILENAME 当前输入文件的名字

格式符 说明
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 字符
%p 指针
%e 指数形式的浮点数
%g 自动选择合适的表达方式
$seq 5 |awk 'BEGIN{print "begin"}(NR > 2){print "command", $0}END{print "end"}'
begin
command 3
command 4
command 5
end

$seq 3 |awk 'BEGIN{print "begin"}{for (i=0; i<3; ++i) print "command", i}END{print "end"}'
begin
command 0
command 1
command 2
command 0
command 1
command 2
command 0
command 1
command 2
end

$awk 'BEGIN{msg="hello liwq"; print index(msg,"liwq")? "ok": "null"}'
ok

$cat ./test.log
hello liwq
hello zhoul

$awk '/liwq/{print}' ./test.log
hello liwq

$awk '!/liwq/{print}' ./test.log
hello zhoul
vislee commented 8 years ago

我要对这300张表增加一个字断,因为awk还算熟悉,就用awk写了个语句生成300条sql执行。 echo 'ALTER TABLE Record_001_20160829 ADD Instance varchar(64) DEFAULT NULL after Ak;' |awk -F'' '{for(i=0;i<300;i++) printf "%s%03d_%s\n",$1, i, $3}'