說明:

程式目的:根據FG的traffic log 分析出每個IP的流量..

=============================
#!/usr/bin/perl

# @ip_array => 儲存所有的IP
# @flow_array => 儲存所有IP的流量
@ip_array;
@flow_array;

# $num_index => 記錄IP的筆數
$num_index=0;

# $ip_flag => 用來避免程式執行的旗標
$ip_flag=0;

# 載入開起./traffic.log檔案,
# 將內容根據每行儲成陣列格式,
# 最後關閉檔案。
$file = './traffic.log';
open(INFO, $file);
@lines = ;
close(INFO);

# 將檔案的每筆資料,進行處理..
foreach $data(@lines) {
  if($data == "") {next;}
  @tmp0 = split(' ',$data);     # 將把ㄧ大筆log 根據空白分隔出所要的IP欄位以及flow欄位
  @tmp1 = split('=',$tmp0[16]); # 再將IP欄位 分隔取出 最後的IP Address
  @tmp2 = split('=',$tmp0[22]); # 再將flow欄位 分隔取出 最後的flow bytes
  $ip = $tmp1[1];
  $flow = $tmp2[1];
  $ip_flag = 0;
 
  # 判斷IP是否已出現過,如果已有出現過,則將封包流量加到 @flow_arrary
  for($i=0;$i<$num_index;$i++) {
    if ($ip eq $ip_array[$i]) {
      $ip_flag = 1;
      $flow_array[$i] = $flow_array[$i] + $flow;
      last;
    }
  }

  # 表示IP未出現過 把IP加到ip_array and flow 加到flow_array
  if ($ip_flag == 0) {
    $ip_array[$num_index] = $ip;
    $flow_array[$num_index] = $flow;
    $num_index++;
  }

}

# 排序 ip_array 和 flow_array

for ($i=0;$i<$num_index;$i++) {
  for ($j=$num_index;$j>0;$j--) {
    if ($flow_array[$j] > $flow_array[$j-1]) {
      $tmp = $flow_array[$j];
      $flow_array[$j] = $flow_array[$j-1];
      $flow_array[$j-1] = $tmp;

      $tmp = $ip_array[$j];
      $ip_array[$j] = $ip_array[$j-1];
      $ip_array[$j-1] = $tmp;
    }
  }
}

# 印出流量前十名的IP
for ($i=0;$i<10;$i++) {
  print "$ip_array[$i] $flow_array[$i] \n";
}

by James Lin

sclin0323 發表在 痞客邦 PIXNET 留言(0) 人氣()