快速业务通道

快速掌握awk linux#高级程序员必备技能#

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-03

基础语法:

awk指令的基本格式是:awk [参数]‘awk程序’文件名

其中awk程序的主要结构是:pattern {action}

一般常使用“关系表达式”来当做pattern,例如:$1>4,$2==$3,"banana"~/an/ (

这是一个正则匹配的判断关系式,若A为字符串,B为一个正在表达式,A~B(判断字符串A是否包含能匹配B表达式的子字符串);A!~B(判断字符串A是否不包含能匹配B表达式的子字符串))

action主要包括一些指令,如awk的i/o指令:print,printf,getline;awk的流程控制指令:if(...){...}else{...}, do{...}while();

awk程序为每个输入行依次地进行每一个pattern的匹配寻找,对每一个匹配上的模式执行相应的action,接着读取下一行并再次开始匹配,知道所有的输入都处理完毕.

在一条语句中可以省略pattern或action,缺省的pattern为匹配所有行,缺省的动作为输出当前行.awk从输入中一次读取一行(一条记录),缺省的行分隔符为n.然后awk将记录分隔为一个个的字段,缺省的字段分隔为空白.一行中的第一个字段为$1,依次往后$2,$3...,整个记录为$0.

awk的内建变量,可使用这些变量来取得相关信息,常见的有:

NF(Number of Fields):为一整数,其值表示$0所包含的字段数目.

NR(Number of Records):为一整数,其值表示awk已读入的数据行数目.

FILENAME:正在处理的数据文件名.

更多的请大家参考http://www.jiayii.com/awk-tutorial/

基础操作举例:测试文件test.txt,内容如下:

  1. 语文 John 105
  2. 数学 Dan 115
  3. 语文 Max 130
  4. 数学 John 125
  5. 物理 John 100
(请注意里面的空白有可能是空白,也可能是tab) 1.获取所有John的成绩单,可以用这些命令: awk ''/John/'' test.txt(action默认输出整行) awk ''/John/{print $0}'' test.txt awk ''$2=="John"{print $0}'' test.txt(默认以空白为分隔,$2既代表每行的第二个域) awk ''$2~/John/{print $0}'' test.txt($2和正则表达式/John/匹配) 2.获取成绩大于120的成绩单 awk ''$3>=120'' test.txt 3.如果原数据文件是以“,”分隔的,那么所有的语句都可以增加分隔参数,如:awk -F"," /John/'' test.txt(这就是-F的作用)


BEGIN和END

在awk中两个特别的表单式,可用于pattern中,提供BEGIN和END是给程序赋予初始状态和在程序结束之后执行一些扫尾工作.任何在BEGIN之后列出的操作将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行.因此,通常使用BEGIN来显示变量和预设初始值,使用END来输出最终结果.

还是以上面的文件举例:

1.将John的所有成绩加和,可用命令如下:

  1. awk ''$2=="John"{total=total $3}END{print total}'' test.txt
  2. awk ''$2=="John"{total=total $3}END{printf("%dn",total)}'' test.txt

2.默认初始成绩为60,再将文件中的成绩累加:

  1. awk ''BEGIN{printf("John成绩累计:");total=60}$2=="John"{total=total $3}END{printf("%dn",total)}'' test.txt

awk数组使用

awk数组使用字符串作为数组的下标;使用时不需要初始化;

实际应用数组运用也是最广的,我们还是以test.txt为数据文件,分别计算各个成员的分数总计:

  1. awk ''{total[$2]=total[$2] $3}END{for(student in total)printf("%s %dn",student,total[student])}'' test.txt

实际应用

在我使用awk的时候,往往是从线上捞取一些统计数据,而使用时往往这些日志文件都不是很规则,那你可以做的是,通过grep或者其他命令将文件转换为一段具有一定规律的输出,然后再使用awk进行处理.

参考文档:

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号