gawk(awk)的用法案例

时间:2023-03-10 07:20:27
gawk(awk)的用法案例

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