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