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