gawk(awk)的用法案例

本文首先简单介绍一个gawk和awk的区别,然后是一点基本使用流程,最后是自己做的一个分析数据文件的脚本代码,供大家参考。另外想了解基本流程的入门知识的可以下载附件pdf格式的awk入门手册。

祝我们进步。

GAWK和AWK:

AWK 是该编程语言本身的名称,它编写于 1977 年。其名称是三个主要作者的姓的首字母缩写:Drs. A. Aho、P. Weinberger 和 B. Kernighan。

因为AWK 是一种文本处理和模式匹配语言,所以它通常称为数据驱动的 语言,程序语句描述需要进行匹配和处理的输入数据,而不是程序操作步骤的序列,在许多语言中都是这样的。AWK 程序在其输入数据中搜索包含模式的记录、对该记录执行指定的操作,直到程序到达输入的末尾。AWK 程序擅长于处理数据库和表型数据,如从多个数据集中提取一些列、建立报表或分析数据。事实上,AWK 适合于编写短小的、一次性程序,以执行一些灵活的文本处理,而使用其他的语言则可能成本较高。另外,作为一种功能强大的工具,AWK 常常在命令行中使用或与管道一起使用。

与 Perl(它起源于 AWK)一样,AWK是一种解释性语言,所以 AWK 程序通常不需要进行编译。相反,在运行时将程序脚本传递给 AWK 解释器。

AWK 输入语言使用类似 C 语言的语法,这使得系统编程人员感觉到非常的方便。事实上,其中许多特性,包括控制语句和字符串函数,如printf 和 sprintf,基本上是相同的。然而,也存在着一些差异。

省略pattern时无条件的执行action

AWK 的不同版本

在 20 世纪 80 年代中期,对 AWK 语言进行了更新,并不同程度地使用一种称为 NAWK (New AWK) 的增强版本对其进行了替换。许多系统中仍然存在着旧的 AWK 解释器,但通常将其安装为 oawk (Old AWK) 命令,而 NAWK 解释器则安装为主要的 awk 命令,也可以使用 nawk 命令。Dr. Kernighan 仍然在对 NAWK 进行维护,与 GAWK 一样,它也是开放源代码的,并且可以免费获得(请参见参考资料部分)。

GAWK 是 GNUProject 的 AWK 解释器的开放源代码实现。尽管早期的GAWK 发行版是旧的 AWK 的替代程序,但不断地对其进行了更新,已包含 NAWK 的特性。

一般的,AWK 始终表示引用通用的语言,而 GAWK 或 NAWK 实现所特有的特性则使用它们的名称进行引用。

使用基础:

工作流程:

1. 执行awk时反复进行下列四个步骤:

i.     自动从指定数据文件中读取一个数据行;

ii.     自动更新相关的内建变量值

iii.     依次执行程序中所有的pattern{Action}指令;

iv.     执行完所有的action后如果有未读入的行,则自动重复执行以上步骤。

2. 读入一个数据行时awk使用内建变量¥0予以记录。每当$0被改动时(比如读入新行)awk会立即重新分析$0的字段情况,并将$0上个字段的数据用$1、$2、$3…记录。

该代码主要目的是分析ns2下搭建的mesh网络平台下的仿真数据,获取仿真文件对应的吞吐量的。仿真数据文件参见附件。

begin和end也是一种pattern,begin在开始执行程序,尚未开启任何输入文件前, 被执行一次.(注意: 只被执行一次)

end在输入文件执行完毕后执行一次。

BEGIN{

init=0;

i=0;

recv=0;

send=0;

}

{

action=$1;     #the event

time=$2;      #the time that event happened

node_nb=$3;

node_nb=substr(node_nb,2,1);

trace_type=$4;

pkt_type=$7;

pkt_size=$8;

if(action=="r"&&trace_type=="MAC"&&(pkt_type=="cbr"||pkt_type=="tcp"))

{

#printf("action=%s  ",action);

#printf("time=%f  ",time);

#printf("node_nb=%s  ",node_nb);

#printf("trace_type=%s  ",trace_type);

#printf("pkt_type=%s  ",pkt_type);

#printf("pkt_size=%d\n",pkt_size);

pkt_byte_sum[i+1]=pkt_byte_sum[i]+(pkt_size-20);

if(init==0)

{

start_time=time;

init=1;

}

end_time[i]=time;

i=i+1;

recv++;

}

elseif(action=="s"&&trace_type=="MAC"&&(pkt_type=="cbr"||pkt_type=="tcp"))

{

send++;

}

}

END{

printf("i=%d\n",i);

#printf("pkt_byte_sum[i]=%d\n",pkt_byte_sum[i]);

#printf("%.2f\t%.2f\n",end_time[0],0);

for(j=1;j<i;j++)

{#printf("pkt_byte_sum[j]=%d\n",pkt_byte_sum[j]);

th=pkt_byte_sum[j]*8/((end_time[j]-start_time)*1000000);

#printf("%.2f\t%.2f\n",end_time[j],th);

}

#printf("%.2f\t%.2f\n",end_time[i-1],0);

#printf("start_time=%.2f\n",start_time);

#printf("pkt_byte_sum[j]=%d\n",pkt_byte_sum[j]);

printf("send=%drecv=%d\n",send,recv);

printf("throughput=%.2f\n",(recv*8*1000)/(1000000.00*(end_time[i-1]-20)));

}

数据节选:

D 36.238800000 _12_ RTR NRTE 2303 cbr 820 [0 0 0 0]------- [12:242 3:278 31 0] [0] 0 0
s 36.242940900 _10_ AGT  --- 2304 cbr 800[0 0 0 0] ------- [10:241 3:292 32 0] [0] 0 0
r 36.242940900 _10_ RTR  --- 2304 cbr 800[0 0 0 0] ------- [10:241 3:292 32 0] [0] 0 0
D 36.242940900 _10_ RTR NRTE 2304 cbr 820 [0 0 0 0] ------- [10:241 3:292 31 0][0] 0 0
s 36.243167500 _14_ AGT  --- 2305 cbr 800[0 0 0 0] ------- [14:245 9:252 32 0] [0] 0 0
r 36.243167500 _14_ RTR  --- 2305 cbr 800[0 0 0 0] ------- [14:245 9:252 32 0] [0] 0 0
D 36.243167500 _14_ RTR NRTE 2305 cbr 820 [0 0 0 0] ------- [14:245 9:252 31 0][0] 0 0
s 36.249101900 _7_ AGT  --- 2306 cbr 800[0 0 0 0] ------- [7:268 3:312 32 0] [0] 0 0
r 36.249101900 _7_ RTR  --- 2306 cbr 800[0 0 0 0] ------- [7:268 3:312 32 0] [0] 0 0
D 36.249101900 _7_ RTR NRTE 2306 cbr 820 [0 0 0 0] ------- [7:268 3:312 31 0][0] 0 0
s 36.249631800 _15_ AGT  --- 2307 cbr 800[0 0 0 0] ------- [15:231 6:226 32 0] [0] 0 0
r 36.249631800 _15_ RTR  --- 2307 cbr 800[0 0 0 0] ------- [15:231 6:226 32 0] [0] 0 0
D 36.249631800 _15_ RTR NRTE 2307 cbr 820 [0 0 0 0] ------- [15:231 6:226 31 0][0] 0 0
s 36.250815500 _12_ AGT  --- 2308 cbr 800[0 0 0 0] ------- [12:270 9:249 32 0] [0] 0 0
r 36.250815500 _12_ RTR  --- 2308 cbr 800[0 0 0 0] ------- [12:270 9:249 32 0] [0] 0 0
D 36.250815500 _12_ RTR NRTE 2308 cbr 820 [0 0 0 0] ------- [12:270 9:249 31 0][0] 0 0
s 36.253488200 _7_ AGT  --- 2309 cbr 800[0 0 0 0] ------- [7:271 0:299 32 0] [0] 0 0
r 36.253488200 _7_ RTR  --- 2309 cbr 800[0 0 0 0] ------- [7:271 0:299 32 0] [0] 0 0
D 36.253488200 _7_ RTR NRTE 2309 cbr 820 [0 0 0 0] ------- [7:271 0:299 31 0][0] 0 0
s 36.256071300 _14_ AGT  --- 2310 cbr 800[0 0 0 0] ------- [14:239 8:244 32 0] [0] 0 0
r 36.256071300 _14_ RTR  --- 2310 cbr 800[0 0 0 0] ------- [14:239 8:244 32 0] [0] 0 0
D 36.256071300 _14_ RTR NRTE 2310 cbr 820 [0 0 0 0] ------- [14:239 8:244 31 0][0] 0 0
s 36.256867254 _6_ RTR  --- 2311 OLSR 56[0 0 0 0] ------- [6:255 -1:255 32 0] [1 21 [HELLO 6 0 21]]
s 36.257302254 _6_ MAC  --- 2311 OLSR 114[0 ffffffff 6 800] ------- [6:255 -1:255 32 0] [1 21 [HELLO 6 0 21]]
r 36.258214508 _2_ MAC  --- 2311 OLSR 56[0 ffffffff 6 800] ------- [6:255 -1:255 32 0] [1 21 [HELLO 6 0 21]]
r 36.258239508 _2_ RTR  --- 2311 OLSR 56[0 ffffffff 6 800] ------- [6:255 -1:255 32 0] [1 21 [HELLO 6 0 21]]
s 36.258618800 _2_ AGT  --- 2312 cbr 800[0 0 0 0] ------- [2:261 0:268 32 0] [0] 0 0
r 36.258618800 _2_ RTR  --- 2312 cbr 800[0 0 0 0] ------- [2:261 0:268 32 0] [0] 0 0
D 36.258618800 _2_ RTR NRTE 2312 cbr 820 [0 0 0 0] ------- [2:261 0:268 31 0][0] 0 0

gawk(awk)的用法案例的更多相关文章

  1. Linux sed 和 awk的用法

    sed用法: 原文链接:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管 ...

  2. <三剑客> 老大:awk命令用法

    awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一 个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是lin ...

  3. awk命令_Linux awk 命令用法详解

    本文索引 awk命令格式和选项 awk模式和操作 模式 操作 awk脚本基本结构 awk的工作原理 awk内置变量(预定义变量) 将外部变量值传递给awk awk运算与判断 算术运算符 赋值运算符 逻 ...

  4. Java Me-List控件的用法案例

    /** * Java Me-List控件的用法案例 */package com.xushouwei.cn; import java.io.IOException;import javax.microe ...

  5. Scala进阶之路-Scala中的枚举用法案例展示

    Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...

  6. Hadoop基础-MapReduce的Partitioner用法案例

    Hadoop基础-MapReduce的Partitioner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Partitioner关键代码剖析 1>.返回的分区号 ...

  7. Hadoop基础-MapReduce的Combiner用法案例

    Hadoop基础-MapReduce的Combiner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编写年度最高气温统计 如上图说所示:有一个temp的文件,里面存放 ...

  8. 文本处理三剑客之AWK的用法

    1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...

  9. jQuery中的ajax用法案例

    什么是 AJAX? AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载 ...

随机推荐

  1. 自动获取淘宝API数据访问的SessionKey

    最近在忙与淘宝做对接的工作,总体感觉淘宝的api文档做的还不错,不仅有沙箱测试环境,而且对于每一个api都可以通过api测试工具生成想要的代码,你完全可以先在测试工具中测试之后再进行代码的编写,这样就 ...

  2. Google C++测试框架系列高级篇:第二章 让GTest学习打印自定义对象

    上一篇:更多关于断言的知识 原始链接:Teaching Google Test How to Print Your Values 词汇表 版本号:v_0.1 让GTest学习打印自定义对象 当一个断言 ...

  3. sql小计汇总 rollup用法实例分析

    这里介绍sql server2005里面的一个使用实例: ),city ),score int) GO 1. 只有一个汇总 select province as 省,sum(score) as 分数 ...

  4. 使用Arcgis Api for Javascript 调用 本地Portal发布的WebMap

    1.环境搭建 安装Arcgis Portal 10.4,Server 10.4,DataStore ,WebAdaptor for IIS,搭建arcgis api for javascript 4. ...

  5. 【docker学习一】CentOS7.5+Docker安装及使用「安装、查看、pull、创建、进入镜像」

    记录安装配置以及使用的过程,可能会有多处摘抄,已注明照抄地址,侵删. 是什么:个人理解,是一种移植性很强的虚拟机,支持版本控制(类似于git),同一个服务器可以运行多个docker容器,每个docke ...

  6. JS中 【“逻辑运算”,“面试题:作用域问题”,“dom对象”】这些问题的意见见解

    1.逻辑运算 ||  &&  ! ||:遇到第一个为true的值就中止并返回 &&:遇到第一个为false的值就中止并返回,如果没有false值,就返回最后一个不是fa ...

  7. Visual Studio Code配置

    Visual Studio Code 从1.23.0开始VS Code就不再默认提供各语言版本, 而是改为使用插件的方式提供语言包. 在插件商店搜索Chinese (Simplified), 安装. ...

  8. c++学习书籍推荐《Beyond the C++ Standard Library》下载

    百度云及其他网盘下载地址:点我 作者简介 Björn Karlsson works as a Senior Software Engineer at ReadSoft, where he spends ...

  9. 网络下载器 EagleGet v2.0.4.60 Full 绿色便携版

    下载地址:点我 基本介绍 EagleGet(亦称 EG Download Accelerator)是一个用于 Windows 系统的下载管理器,它是免费软件.EagleGet 使用多线程技术,支持从Y ...

  10. Python一秒提供Rest接口

    Python一秒提供Rest接口 使用的是Anaconda安装的Python环境; 新建py文件(例如:restapi.py) # -*- coding: utf-8 -*- from flask i ...