AWK脚本培训.doc_第1页
AWK脚本培训.doc_第2页
AWK脚本培训.doc_第3页
AWK脚本培训.doc_第4页
AWK脚本培训.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、AWK简介AWK名字来源于三位创造者Aho、Weinberger和Kernighan统称。AWK擅长处理文本数据。二、AWK的调用方式awk -Ffs -v var=value program | -f progfile . file .1、命令行方式例如:awk print $1 fileps -ef|grep program|awk print $22、文件方式例如:awk -f progfile file3、文件解释器方式AWK脚本文件开头需要注明调用方式,典型写法为:#!/bin/awk -f 注意-f后面有空格。脚本文件需要有执行权限,如果没有需要使用chmod +x progfile赋权。例如:progfile file三、AWK参数-F指定域分隔符,例如:-F |,即以|作为域分隔符,默认分隔符为一个或多个空格或TAB,即:space:space:*。-v定义变量,从shell给awk传递变量,如-vDATE=$DATE,即将shell中$DATE变量值传递给awk变量DATE。-f指定脚本文件,例如-f progfile。四、AWK内置变量FS域分隔符NF域个数NR行数FNR同上FILENAME处理的文件名,当输入为管道时,FILENAME为空。RS行分隔符OFS输出域分隔符ORS输出行分隔符OFMT数字输出格式CONVFMT数字内部转换格式SUBSEP多维数组索引分隔符ARGC输入参数个数ARGV输入参数数组ENVIRON环境变量数组RSTARTmatch()函数正则匹配到字符串开始位置RLENGTHmatch()函数正则匹配到字符串的长度五、AWK内置函数blength(s)计算字符串长度(byte为单位)length(s)计算字符串长度(character为单位)rand()生成随机数srand(expr)设置rand() seedint(x)字符串转换为整型substr(s, m , n)取子字符串index(s, t)在字符串s中定位t字符串首次出现的位置match(s, ere)在字符串s中匹配正则ere,match修改RSTART、RLENGTH变量。split(s, a, fs)将字符串分割到数组中sub(ere, repl , in)字符串替换gsub同上sprintf(fmt, expr, .)拼字符串system(cmd)在shell中执行cmd。toupper(s)字符串转换为大写tolower(s)字符串转换为小写六、AWK流程控制if(expression) statement else statement while(expression) statementfor(expression;expression;expression) statementfor(var in array) statementdo statement while(expression)breakcontinuestatement .expression # commonly var = expressionprint expression-list expressionprintf format , expression-list expressionreturn expressionnext # skip remaining patterns on this input line.delete array expression # delete an array element.exit expression # exit immediately; status is expression.七、AWK简单应用范例AWK脚本分为三部分BEGIN段,处理段,END段。其中BEGIN段在第一行读取之前执行,END段在最后一行处理后执行。1、内容过滤,同grep tag file。#前两个语句为正则匹配awk /tag/ print fileawk if($0 /tag/) print fileawk if(index($0, tag) 0) print file2、取特定列,同cut f1 f3 f5 file。#输出文件第1、3、5列awk print $1, $3, $5 file3、对文件内容进行剔重,类似sort -u file,但未排序。#如果当前行未存在于rec HASH表中,则记录此行数据,并输出awk if(!($0 in rec) rec$0=1; print $0; fileAWK中数组有两种用法普通数组和HASH数组,此处为HASH数组。4、仅输出数据#输出100行数据awk BEGIN for(i = 0; i 10) printf(%s %dn, i, toti); file#使用第一列作为分组列,第二列、第三列为聚合列awk tot1$1 += $2; tot2$1 += $3;ENDfor(i in tot1) printf(%s %d %dn, i, tot1i, tot2i); file#多维数组例子,可将多个字段作为分组列,AWK使用一维数组模拟多维数组,使用034作为分隔符awk tot1$1, $2 += $3; tot2$1, $2 += $4;ENDfor(i in tot1) printf(%s %d %dn, i, tot1i, tot2i); file 2、文件操作#将两个文件根据filename1的第一列和filename2的第二列进行关联BEGIN #读取filename1文件内容 while(getline filename1) != NULL) rel$1 = 1; rec1$1 = $2; while(getline split/ substr($1,1,7);3、从SHELL向AWK传递变量awk -vAWK_DATE=$DATE BEGIN print AWK_DATE4、在AWK内部读取shell命令输出#读取ls命令输出,在AWK中打印输出BEGIN while(ls|getline) print $0; #读取date输出BEGIN date | getline; print $0; date +%Y | getline v_year; print v_year;5、将AWK输出通过管道传递给SHELL命令#将打印信息输出给sort进行排序BEGIN for(i = 0; i 0) printf(%sn, substr(str1, RSTART, RLENGTH); else printf(%s not matchn, str1); match(str2, a-zA-Za-zA-Z0-9.*a-zA-Z0-9a-zA-Z0-9.*.a-zA-Z*a-zA-Z); if(RSTART 0) printf(%sn, substr(str2, RSTART, RLENGTH); else printf(%s not matchn, str2); match(str3, a-zA-Za-zA-Z0-9.*a-zA-Z0-9a-zA-Z0-9.*.a-zA-Z*a-zA-Z); if(RSTART 0) printf(%sn, substr(str3, RSTART, RLENGTH); else printf(%s not matchn, str3); match(str4, a-zA-Za-zA-Z0-9.*a-zA-Z0-9a-zA-Z0-9.*.a-zA-Z*a-zA-Z); if(RSTART 0) printf(%sn, substr(str4, RSTART, RLENGTH); else printf(%s not matchn, str4);7、自定义函数function my_plus(a, b) return a + b;BEGIN printf(%dn, my_plus(123, 321);九、一些应用范例1、验证话单正确性的一个脚本/vc/ #取话单中各个变量 call_type = substr($0,3,2); call_duration = int(substr($0,95,6); roam_type = substr($0,210,1); fee_type = substr($0,211,1); dial_type = substr($0,212,3); chat_type = substr($0,215,3); cfee = int(substr($0,218,9); lfee = int(substr($0,236,9); #如果为国际漫游,不分析,跳过 if(roam_type 4) next; if(call_type = 01) if(substr(dial_type,1,1) != 0) if(lfee 0) printf(%s:LFEE_01n, $0); next; if(roam_type != 0) if(fee_type = 0 | fee_type = 2 | fee_type = 3) if(lfee 0) printf(%s:LFEE_ERR02n, $0) else if(cfee 0) printf(%s:CFEE_ERR01n, $0); else if(fee_type != 0) if(cfee 0) printf(%s:CFEE_ERR02n, $0); if(call_type = 02) if(lfee 0) printf(%s:LFEE_ERR03n, $0); 2、一个模拟求取批价标批费率计划的例子function my_match(str, pat)#for debug#printf(str=|%s|,pat=|%s|n, str, pat); if(pat = *) return 1; n = split(pat, arr, ,); for(z = 1; z |%s|n, str, arrz); match(str, arrz); if(RSTART 0) return 1; return 0; BEGIN dial_cnt = 0; while(getline dial.lst) != NULL) dialdial_cnt = $1; dial_cnt+; chat_cnt = 0; while(getline chat.lst) != NULL) chatchat_cnt = $1; chat_cnt+; cfg_cnt = 0; while(getline plan.lst) != NULL) cfg_dialcfg_cnt = $1; cfg_chatcfg_cnt = $2; cfg_itemcfg_cnt = $3; cfg_plancfg_cnt = $4; cfg_cnt+; for(d = 0; d dial_cnt; d+) for(c = 0; c chat_cnt; c+) printf(%s %s|, diald, chatc); out_cnt = 0; for(i = 0; i cfg_cnt; i+) #for debug#printf(ntest match=|; |n, d, c, i, diald, cfg_diali, chatc, cfg_chati); if(my_match(diald, cfg_diali) =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论