已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
awk命令详解 (转 整理)一、前言awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。二、基本语法awk opion awk_script input_file1 input_file2 .awk的常用选项option有: -F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,awk使用环境变量IFS的值 -f filename : 从文件filename中读取awk_script -v var=value : 为awk_script设置变量awk有三种运行方式:第一种,把awk的脚本命令直接放在命令中。第二种,把awk的所有的脚本命令放在一个脚本文件中,然后用-f选项来指定要运行的脚本命令文件。第三种,将awk_script放入脚本文件并以 #!/bin/awk -f 作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之。三、awk脚本awk脚本可以由一条或多条awk_cmd组成,对于多个awk_cmd,一个awk_cmd完成后,应该另起一行,以便进行隔。 awk_cmd由两部分组成: awk_pattern actions 。另外,在awk命令中直接使用awk_script时,awk_script也可以被分成多行书写,但必须确保整个awk_script被单引号括起来。awk命令的一般形式:awk BEGIN actions awk_pattern1 actions .awk_patternN actions END actions inputfile其中 BEGIN actions 和 END actions 是可选的。在awk脚本中可以使用AWK本身内置变量,如下: ARGC 命令行变元个数ARGV 命令行变元数组FILENAME 当前输入文件名FNR 当前文件中的记录号FS 输入域分隔符,默认为一个空格RS 输入记录分隔符NF 当前记录里域个数NR 到目前为止记录数OFS 输出域分隔符ORS 输出记录分隔符awk脚本的运行过程: 如果BEGIN 区块存在,awk执行它指定的actions。 awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取) awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS或由参数指定。 把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。 当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤和,这个过程一直持续,直到awk读取到文件尾。 当awk读完所有的输入行后,如果存在END,就执行相应的actions。1)input_file可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。2)一条awk_cmd的awk_pattern可以省略,省略时不对输入记录进行匹配比较就执行相应的actions。一条awk_cmd的actions 也可以省略,省略时默认的动作为打印当前输入记录,即print $0 。一条awk_cmd中的awk_pattern和actions不能同时省略。3) BEGIN区块和END区块别位于awk_script的开头和结尾。awk_script中只有END区块或者只有BEGIN区块是被允许的。如果awk_script中只有BEGIN actions ,awk不会读取input_file。4) awk把输入文件的数据读入内存,然后操作内存中的输入数据副本,awk不会修改输入文件的内容。5) awk的总是输出到标准输出,如果想让awk输出到文件,可以使用重定向。3.1.awk_patternawk_pattern模式部分决定actions动作部分何时触发及触发actions。awk_pattern可以是以下几种类型:1) 正则表达式用作awk_pattern: /regexp/注意,正则表达式regexp必须被/包起来awk中正则表达式匹配操作中经常用到的字符: $ . | () * / :通用的regexp元字符+ : 匹配其前的单个字符一次以上,是awk自有的元字符,不适用于grep或sed等? : 匹配其前的单个字符1次或0次,是awk自有的元字符,不适用于grep或sed等关于正则表达式的更多内容请参正则表达式举例:awk / *$0.0-90-9.*/ input_file比如,行内容为$0.99. helllo的行就可以和上面的正则表达式相配2) 布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。 表达式中可以使用变量(如字段变量$1,$2等)和/regexp/ 布尔表达式中的操作符:关系操作符: = = !=匹配操作符: value /regexp/ 如果value匹配/regexp/,则返回真value ! /regexp/ 如果value不匹配/regexp/,则返回真举例: awk $2 10 print ok input_fileawk $3 /d/ print ok input_file &(与) 和 |(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非) 可以用于布尔表达式或者/regexp/之前。举例: awk ($1 10) print $0 ok input_fileawk /d/ | /x$/ print $0 ok input_file 其它表达式用作awk_script,如赋值表达式等举例: awk (tot+=$6); ENDprint total points : tot input_file / 分号不能省略awk tot+=$6 print $0 ENDprint total points : tot input_file / 与上面等效当使用赋值表达式时,表示如果赋值后的变量是数字的话,如果为非0,就匹配,否则不匹配;如果为字符串的话,非空就为匹配,否则不匹配。awk内置字符串函数:gsub(r,s) 在整个$0中用s替代rawk gsub(/name/,xingming) print $0 tempgsub(r,s,t) 在整个t中用s替代rindex(s,t) 返回s中字符串t的第一位置awk BEGIN print index(Sunny,ny) temp 返回4length(s) 返回s的长度match(s,r) 测试s是否包含匹配r的字符串awk $1=J.Lulu print match($1,u) temp 返回4split(s,a,fs) 在fs上将s分成序列aawk BEGIN print split(12#345#6789,myarray,#)返回3,同时myarray1=12, myarray2=345, myarray3=6789sprint(fmt,exp) 返回经fmt格式化后的expsub(r,s) 从$0中最左边最长的子串中用s代替r(只更换第一遇到的匹配字符串)substr(s,p) 返回字符串s中从p开始的后缀部分substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分awk字符串连接操作 chengmocentos5 $ awk BEGINa=a;b=b;c=(ab);print c ab 2.7. printf函数的使用:字符转换: echo 65 |awk printf %cn,$0 输出A awk BEGIN printf %fn,999 输出999.000000格式化输出:awk printf %-15s %sn,$1,$3 temp 将第一个域全部左对齐显示2.8. 其他awk用法: 向一行awk命令传值:awk if ($5who | awk if ($1=user) print $1 are in $2 user=$LOGNAME 使用环境变量awk脚本命令:开头使用 !/bin/awk -f ,如果没有这句话自含脚本将不能执行,例子:!/bin/awk -f# all comment lines must start with a hash # name: student_tot.awk# to call: student_tot.awk grade.txt# prints total and average of club student points# print a header firstBEGINprint Student Date Member No. Grade Age Points Maxprint Name Joined Gained Point Availableprint=# lets add the scores of points gained(tot+=$6);# finished processing now lets print the total and average pointEND print Club student total points : tot print Average Club Student points : tot/N2.9. awk数组:awk的循环基本结构For (element in array) print arrayelementawk BEGIN record=123#456#789;split(record,myarray,#) END for (i in myarray) print myarrayi 3.0 awk中自定义语句一.条件判断语句(if)if(表达式) #if ( Variable in Array )语句1else语句2格式中语句1可以是多个语句,如果你为了方便Unix awk判断也方便你自已阅读,你最好将多个语句用括起来。Unix awk分枝结构允许嵌套,其格式为:if(表达式)语句1else if(表达式)语句2else语句3chengmolocalhost nginx# awk BEGIN test=100;if(test90) print very good;else if(test60) print good;else print no pass;very good 每条命令语句后面可以用“;”号结尾。 二.循环语句(while,for,do)1.while语句格式:while(表达式)语句例子:chengmolocalhost nginx# awk BEGIN test=100;total=0;while(i=test) total+=i; i+;print total;50502.for 循环for循环有两种格式:格式1:for(变量 in 数组)语句例子:chengmolocalhost nginx# awk BEGIN for(k in ENVIRON) print k=ENVIRONk;AWKPATH=.:/usr/share/awkOLDPWD=/home/web97SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpassSELINUX_LEVEL_REQUESTED=SELINUX_ROLE_REQUESTED=LANG=zh_CN.GB2312。说明:ENVIRON 是awk常量,是子典型数组。格式2:for(变量;条件;表达式)语句例子:chengmolocalhost nginx# awk BEGIN total=0;for(i=0;i=100;i+) total+=i;print total;50503.do循环格式:do语句while(条件)例子:chengmolocalhost nginx# awk BEGIN total=0;i=0;do total+=i; i+;while(i=100)print total;5050 以上为awk流程控制语句,从语法上面大家可以看到,与c语言是一样的。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。break 当 break 语句用于 while 或 for 语句时,导致退出程序循环。 continue 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。 next 能能够导致读入下一个输入行,并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。 exit 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。 NR与FNR:QUOTE:Aawk对多输入文件的执行顺序是,先将代码作用于第一个文件(一行行读入),然后该重复的代码又作用于第二个文件,再作用于第三个文件。Bawk对多输入文件的执行顺序产生了行序号的问题。当第一个文件执行完,下次读入第二个文件,那么第二个文件的第一行怎么算呢?如果又计为1的话,那不就两个1了么?(因为第一个文件也有第一行)。这就是NR和FNR的问题。 NR :全局行数(第二个文件的第一行接着第一个文件尾行数顺序计数) FNR:当前文件自身的行数(不考虑前几个输入文件的自身行数及总数) 例如:data1.txt中有40行,data2.txt中有50行,那么awk data1.txt data2.txt NR 的值依次为:1,240,41,4290 FNR的值依次为:1,240, 1, 250 getline函数说明:awk 的 getline语句用于简单地读取一条记录。如果用户有一个数据记录类似两个物理记录,那么getline将尤其有用。它完成一般字段的分离(设置字段变量$0 FNR NF NR)。如果成功则返回1,失败则返回0(到达文件尾)。QUOTE:Agetline从整体上来说,应这么理解它的用法: 当其左右无重定向符 | 或 时,getline作用于当前文件,读入当前文件的第一行给其后跟的变量 var 或$0(无变量);应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到 的返回结果是隔行的。 当其左右有重定向符 | 或 时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被 awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。Bgetline用法大致可分为三大类(每大类又分两小类),即总共有6种用法。代码如下:QUOTE:nawk BEGIN“cat data.txt”|getline d; print d data2.txt nawk BEGIN“cat data.txt”|getline; print $0 data2.txtnawk BEGINgetline d “data.txt”; print d da
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年机关车队调度员招聘面试题及答案
- 2025年重症新冠肺炎试题及答案
- 患者误吸风险评估
- 银行科技部门介绍
- 2023年国家公务员录用考试《申论》真题试题(行政执法卷)及答案解析
- 2025年国务院国资委委属事业单位招聘笔试备考题库及参考答案详解
- 营销广告策划行业竞争态势研究
- 新兴科技对传统制造业的冲击及应对
- 2025麻精药品培训考试试题(含参考答案)
- 公安院校公安专业毕业生考试录用公务员考试真题及答案2022
- 2024至2030年中国石晶地板行业市场调查研究及投资前景展望报告
- JG-T 24-2018 合成树脂乳液砂壁状建筑涂料
- 统计学课内实验报告(详解+心得)1
- HG/T 3811-2023 工业溴化物试验方法 (正式版)
- 电子商务导论 记分作业资料-上海开大参考资料
- 养老院建筑设计案例分析报告
- 人居环境科学市公开课一等奖省赛课微课金奖课件
- 四年级【语文(统编版)】古诗三首(第一课时)课件
- HSK 2标准教程(完整版)
- 施工质量控制课件
- 儿科呼吸衰竭课件
评论
0/150
提交评论