已阅读5页,还剩56页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
awk使用说明,2010年12月,awk说明,awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。 它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。 它在命令行中使用,但更多是作为脚本来使用。 awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是alfred aho、brian kernighan、peter weinberger。gawk是awk的gnu版本,它提供了bell实验室和gnu的一些扩展。,awk工作原理,awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。 如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。,awk的语法格式,awk pattern filename awk action filename awk pattern action filename,例子,数据来自命令 只有动作 ls | awk print 只有模式 ls | awk /./ 数据来自文件 只有动作 awk print /etc/devices 只有模式 awk /./ /etc/devices,模式pattern,模式可以是以下任意一个: /正则表达式/:使用通配符的扩展集。 关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2%1选择第二个字段比第一个字段长的行。 模式匹配表达式:用运算符(匹配)和!(不匹配)等。 模式,模式:指定一个行的范围。该语法不能包括begin和end模式。 begin:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。 end:让用户在最后一条输入记录被读取之后发生的动作。,/正则表达式/,正则表达式以/开始/结束 c 非元字符 c 转义字符(元字符,比如w就表示单词字符) . 匹配任意字符 匹配字符串开始 $ 匹配字符串结尾 abc. 匹配abc.中意义一个字符 abc. 匹配除abc.中之外的任意一个字符 r1|r2 要么r1,要么r2 r1r2 连接r1与r2 r+ 匹配一个或多个r r* 匹配0个或多个r r? 匹配0个或者1个r (r) 分组:匹配r,rn r重复n次 rn, r重复至少n次 rn,m r重复至少n次,最多m次 y 匹配一个单词开始与结尾的空字符串,其实就是匹配一个以y后字符串开始与结束的单词 b 匹配一个单词中的空字符串,其实就是匹配包含有b后字符串的单词 匹配单词结束的空字符串,其实就是以后字符串结束的单词 w 匹配单词字符 (字母, 数字, 下划线). w 匹配非单词字符 匹配缓冲字符串开始位置的空字符串 匹配缓冲字符串结束位置的空字符串,正则表达式举例,gawk “/.at/“ test 匹配三个字符,其中后两个是at gawk “/th/“ test 以th开头的行 gawk “/at$/“ test 以at结尾的行 gawk “/thait/“ test 包含that或者thit的行 gawk “/thait/“ test 包含th开始的t结尾的中间一个字符不是ai的行,gawk “/this|that/“ test 包含this或者that的行 gawk “/e+/“ test 包含至少一个e的行 gawk “/e*/“ test 包含e与不包含e的行 gawk “/thise?/“ test 包含thise与this的行 gawk “/thi(se)?/“ test 包含thi与thise的行,gawk “/thi(se)1/“ test 包含thise的行 gawk “/thi(se)1,/“ test 包含thise,thisese,的行 gawk “/thi(se)1,3/“ test 包含thise,thisese,thisesese的行 gawk “/thy/“ test 有以th结尾单词的行 gawk “/yth/“ test 有以th开始的行,gawk “/bhi/“ test 有单词中包含hi的行,在开头或者结尾不算 gawk “/whi/“ test 有单词包含字符hi,并且单词中只能包含字母数字与_的行 gawk “/whi/“ test 有单词包含字符hi,并且单词中可以包含其他字符的行 gawk “/“ test 有单词以wo结尾的行,字符类,:alnum: 字母数组字符. :alpha: 字母字符. :blank: 空格与tab字符. :cntrl: 控制字符. :digit: 数字字符. :graph: 可打印且可见字符. (空格是可打印的,但不可见.) :lower: 小写字符. :print: 可打印字符(非控制字符.) :punct: 标点字符 (非字母,数字, 控制, 或空格的字符). :space: 空字符(空格, tab, 格式制表字符). :upper: 大写字母字符.,字符类举例,gawk “/:digit:w/” test 有单词以一个数字开始,并且只能包含字母数字与_的行,关系表达式,关系表达式匹配那些结果为真的行。 关系运算符号 = = != 匹配正则表达式 ! 不匹配正则表达式 关系表达式中有可以使用变量,awk的环境变量,基本概念:记录与域,记录 awk把每一个以换行符结束的行称为一个记录。 记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ors和rs中。 $0变量:它指的是整条记录。 如$ awk print $0 test将输出test文件中的所有记录。 变量nr:一个计数器,每处理完一条记录,nr的值就增加1。 如$ awk print nr,$0 test将输出test文件中所有记录,并在记录前显示记录号。,域 记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量nf中保存该值。 如$ awk print $1,$3 test将打印test文件中第一和第三个以空格分开的列(域)。,域分隔符 内建变量fs保存输入域分隔符的值,默认是空格或tab。我们可以通过-f命令行选项修改fs的值。 如$ awk -f: print $1,$5 test将打印以冒号为分隔符的第一,第五列的内容。 可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中。 如$awk -f:t print $1,$3 test,表示以空格、冒号和tab作为分隔符。 输出域的分隔符默认是一个空格,保存在ofs中。 如$ awk -f: print $1,$5 test,$1和$5间的逗号就是ofs的值。,关系表达式举例,gawk -f : $3=74 /etc/passwd 返回/etc/passwd中第三字段为74的行 gawk -f : $1/louis/ /etc/passwd 返回第一字段满足模式/louis/的行,模式运算,pattern & pattern 逻辑且 pattern | pattern 逻辑或 pattern ? pattern : pattern 三目运算 (pattern) 优先级别 ! pattern 逻辑否 pattern1, pattern2 模式范围:返回pattern1与pattern2之间所有行,模式运算举例,gawk -f : /gdm/,/louis/ /etc/passwd 返回匹配/gdm/到匹配/louis/之间的所有行 gawk -f : /gdm/|/louis/ /etc/passwd 返回匹配/gdm/或者/louis/的行 gawk -f : /gdm/&/louis/ /etc/passwd 返回既匹配/gdm/有匹配/louis/的行 gawk -f : !/gdm/ /etc/passwd 返回不匹配/gdm/的行 gawk -f : !(/gdm/|/louis/) /etc/passwd 返回不匹配/gdm/与/louis/的行 gawk -f : 2030?/gdm/:/louis/ /etc/passwd 2030为真则匹配/gdm/,否则匹配/louis/,begin模块,begin模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如ofs,rs和fs等,以及打印标题。 语法格式:begin语句1;语句n 每个语句之间使用;分号分隔 如:$ awk beginfs=“:”; ofs=“t”; ors=“nn”print $1,$2,$3 test。 上式表示,在处理输入文件以前,域分隔符(fs)被设为冒号,输出文件分隔符(ofs)被设置为制表符,输出记录分隔符(ors)被设置为两个换行符。$ awk beginprint “title test“只打印标题。,end模块,end不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。 如$ awk endprint “the number of records is“ nr test,上式将打印所有被处理的记录数。 gawk beginfs=“:“;print “=“print $1endprint “*“ /etc/passwd begin与end本质还是动作,动作action,作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份: 变量或数组赋值 输出命令 内置函数 控制流命令,变量或数组赋值,变量定义: 变量名=值 在awk中,变量不需要定义就可以直接使用,变量类型可以是数字或字符串。 例子: gawk a=1;print a $2 /etc/passwd gawk begina=1print a+ $0 /etc/passwd gawk begina=1a+=2;print a $0 /etc/passwd,awk可以在命令行中给变量赋值,然后将这个变量传输给awk脚本。在awk脚本中,这些变量使用起来就象是在脚本中建立的一样。 如$ awk -f: -f awkscript month=4 year=2004 test 上式的month和year都是自定义变量,分别被赋值为4和2004。 注意:如果参数前面出现test,那么在begin语句中的变量就不能被使用。 域变量也可被赋值和修改 如$ awk $2 = 100 + $1; print test, 上式表示,如果第二个域不存在,awk将计算表达式100加$1的值,并将其赋值给$2,如果第二个域存在,则用表达式的值覆盖$2原来的值。 如:$ awk $1 = “root“$1 =“test“;print test 如果第一个域的值是“root”,则把它赋值为“test”. 注意,字符串一定要用双引号。,内建变量的使用。 awk -f: ignorecase=1; $1 = “mary“print nr,$1,$2,$nftest 把ignorecase设为1代表忽略大小写,打印第一个域是mary的记录数、第一个域、第二个域和最后一个域。,变量支持的运算符号,数组,awk中的数组的下标可以是数字和字母,称为关联数组。 数组使用 gawk begina0=“a1“;a1=“a2“endprint a0 /etc/passwd 用变量作为数组下标。 gawk -f: begini=0ai+ = $1 endprint a0 /etc/passwd 用字符串作为下标。 gawk begina“x“=“a1“;a“y“=“a2“endprint a“x“ /etc/passwd 用域值作为数组的下标。 gawk -f: anr=$1endprint a1 /etc/passwd,special for循环用于读取关联数组中的元素。 gawk -f: anr=$1endfor(x in a) print ax /etc/passwd delete函数用于删除数组元素。 gawk -f: anr=$1endfor(x in a) delete ax /etc/passwd,多维数组,数组下标1,下标2,输出命令,close(file , how) 关闭文件,管道与合作进程,选项how必须是to或者from,用来关闭双工的管道. getline 用下条记录设置$0; 设置 nf, nr, fnr. getline file 用文件file的下条记录设置$0; 设置 nf. getline var 用下条记录设置var变量; 设置 nr, fnr. getline var file 用文件file的下条记录设置var变量.,command | getline var command |& getline var command作为合作进程运行 next 停止处理当前记录. nextfile 停止处理当前文件, filename与argind被更新, fnr 重置为1. print 打印当前记录.输出记录用ors变量终止.,print expr-list 打印表达式.每个表达式由变量ofs分隔,输出记录用ors变量终止. print expr-list file 打印表达式到文件.每个表达式由变量ofs分隔,输出记录用ors变量终止. printf fmt, expr-list 格式化打印输出. printf fmt, expr-list file 格式化打印输出到文件. system(cmd-line) 执行cmd-line,返回退出码.(在非posix系统可能不支持) fflush(file) 刷新管道与文件的缓冲数据,没有文件,则是是标准输出.,getline的例子,gawk -f: getline d;print nr “ d /etc/passwd gawk -f: getline d “/root/test“;print d /etc/passwd 请注意其中文件名的双引号的使用 gawk -f: “date“|getline d;print d /etc/passwd 注意其中date的双引号的使用,print与printf的例子,gawk -f: print filename “ $1 /etc/passwd gawk -f: printf “%d:%s%sn“,nr,filename,$1 /etc/passwd,printf支持的格式,%c 字符输出 %d , %i 整数输出 %e , %e 小数科学记数法输出 %f 普通格式小数输出 %g , %g 最短小数格式输出 %o 8进制整数输出 %u 无符号整数输出 %s 字符串输出 %x , %x 16进制整数输出 % %的原义转换,printf输出格式的辅助选项,count$ 使用指定位置的参数最为输出 *count$ 使用指定位置的参数作为格式描述的数据 - 控制对齐方式 + 是否显示+符号 # 自动可选格式 0 填充0 空格 填充空格 width 输出宽度 .prec 输出精度,printf的例子,gawk -f: printf “%4$d:%5$s%6$sn“,nr,filename,$1,5,20,10 /etc/passwd 指定参数位置 gawk -f: printf “%10.2fn“,50000.8888 /etc/passwd 指定输出长度与精度 gawk -f: printf “%1$10.2fn“,50000.8888,10,7,2 /etc/passwd 指定输出位置与宽度与精度 gawk -f: printf “%1$*2$.*4$fn“,50000.8888,10,7,2 /etc/passwd 用2与4位置的参数作为宽度与精度,其他io函数的例子,gawk -f: system(“echo =“);print $1 /etc/passwd,内置函数,数学函数 字符串函数 日期函数 位操作函数 国际化函数,数学函数,atan2(y, x) 反正切 cos(expr) 余弦 exp(expr) 自然指数 int(expr) 取整 log(expr) 自然对数 rand() 随机数 sin(expr) 正弦 sqrt(expr) 平方根 srand(expr) 随机种,字符串函数,asort(s , d) 返回s中数组个数,s被排序,且下标从1开始。如果d指定,排序结果存放在d中,s不改变。 asorti(s , d) 与asort作用一样。只是排序后,s中的值被替换成s的下标 gensub(r, s, h , t) 在目标字符串t中所有匹配正则表达式r,h是g或者g开始的字符串,则全部被替换成s,h是数字就替换指定位置的匹配字符串,如果t没有指定,则使用$0。t不会被修改,替换后的文本作为返回值返回,s可以使用反响引用n指定匹配模版替换,gsub(r, s , t) 作用同上,但是全局替换,返回替换次数,并且原字符串被修改,字符索引从1开始 length(s) 返回字符串长度,或者数组长度,不指定t,则使用$0。 match(s, r , a) 返回r在s中匹配的位置,没有匹配则返回0 同时设置rstart与rlength变量.如果提供数组a,则使用数组中对应位置的字符串替换r split(s, a , r) 使用r正则表达式把字符串s分解成数组,r不指定,则使用fs变量,最后返回分解的个数,sprintf(fmt, expr-list) 返回格式化字符串,. strtonum(str) 把字符串转换成整数 sub(r, s , t) 使用r匹配方式使用s替换t substr(s, i , n) 取子串 tolower(str) 小写转换 toupper(str) 大写转换,字符串函数例子,gawk -f: begina0=5;a1=2;a2=4;a4=3endb=asort(a);print b “:“ a1 a2 a3 a4 /dev/null gawk -f: begina0=5;a1=2;a2=4;a4=3endb=asorti(a);print b “:“ a1 a2 a3 a4 /dev/null,日期函数,mktime(datespec) 按照秒的单位返回日期,datespec是格式字符串yyyy mm dd hh mm ss dst. strftime(format , timestamp) 格式化日期 systime() 返回当前系统日期,日期函数支持的格式,位操作函数,and(v1, v2) compl(val) 取反 lshift(val, count) 左移 or(v1, v2) rshift(val, count) 右移 xor(v1, v2) 异或,国际化函数,bindtextdomain(directory , domain) 指定mo文件目录,缺省domain是textdomain.目录为null(“),返回当前domain. dcgettext(string , domain , category) 返回被翻译的字符串,缺省domain是textdomain.缺省category是“lc_messages“. dcngettext(string1 , string2 , number , domain , category) 返回string1与string2的复数形式翻译,自定义函数,function name(parameter list) statements return expr 注意:function可以使用func,控制流命令,if (condition) statement else statement while (condition) statement do statement while (condition) for (expr1; expr2; expr3) statement for (var in array) statement break continue delete arrayindex delete array exit expression statements ,管道与重定向输出,print . file print . | command print . |& command,gawk参数,-f fs or -field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-f:。 -v var=value or -asign var=value 赋值一个用户定义变量。 -f scripfile or -file scriptfile 从脚本文件中读取awk命令。 -mf nnn and -mr nnn 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是bell实验室版awk的扩展功能,在标准awk中不适用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GBT 34716-2017 压敏胶粘剂溶解度的测定》专题研究报告
- 2025年中国钢铁行业绿电低碳转型研究报告
- 2025年四年级数学(人教版)下册期中测验卷及答案
- 1-己烯装置操作工安全生产意识竞赛考核试卷含答案
- 光纤着色并带工标准化能力考核试卷含答案
- 网络预约出租汽车司机9S执行考核试卷含答案
- 钢丝制品精整工安全理论竞赛考核试卷含答案
- 公司半导体继电器装调工职业健康及安全技术规程
- 《GBT 35479-2017 超硬磨料制品 金刚石或立方氮化硼磨具 形状总览和标记》专题研究报告
- 经编钳针工岗位设备安全技术规程
- 校服招标方案
- 萧朴生的红色故事
- 会展概论-来逢波-习题答案
- 地质勘查类题库
- 小班-数学-爱跳的棉花糖(上下、前后、里外方位)-课件(互动版)
- 新能源充电站项目可行性研究报告
- 2023年武汉市水务集团限公司招聘50人笔试参考题库(共500题)答案详解版
- 2023室内冰雪场馆保温及制冷系统设计规程
- 工程认价单子
- 基础会计实训填制与审核记账凭证介绍课件
- 宾川县宝丰寺铅锌磺铁矿有限责任公司铅锌磺铁矿矿山地质环境保护与土地复垦方案
评论
0/150
提交评论