2009年12月23日
GoでWiresharkのログ(csv)の必要な部分を単純に抜き出してみた
Wiresharkのログを確認する際に、Excel2003では65536行を超えるcsvが省略されてしまうので少しばかり不便です。
そこで、ログの中から必要な部分を抜き出すGoを書いてみました。
PHPと同じような感覚で作れましたが、実行時間は体感的にはPHPと同じくらい(遅い?)でした。ファイルのIOが影響しているのか私の書き方が悪いのか分かりませんが、ちょっとがっかりです。
※最初にPHPで作って、後からGoで作りました。
Wiresharkのログのcsvは大まかに以下のようになっています。ログの内容は適当です。
"No.","Time","Source","Destination","Protocol","Info" "1","0","192.168.0.3","192.168.0.11","TCP","nfs > 7014 [ACK] Seq=1000 Ack=10 Win=5678 Len=1460" "2","0.1","192.168.0.4","192.168.0.11","TCP","nfs > 7015 [ACK] Seq=2000 Ack=20 Win=6789 Len=1460" "3","0.2","192.168.0.99","192.168.0.11","TCP","nfs > 7016 [ACK] Seq=3000 Ack=30 Win=7890 Len=1460"
作りとしては、"Source","Destination","Protocol","Info"を比較したりして抜き出します。
作るにあたり、Go標準の正規表現や動的配列のライブラリを使用しました。すごく簡単に使えて感動です。
ソースコード
ライブラリの使い方の参考にどうぞ。
Windowsでコンパイルしたい方はfp.Stat()を消してファイルサイズを手入力してください。
package main import ( "os"; "bytes"; "strings"; "regexp"; "container/vector"; ) const ( // 自身のIPアドレス IP = "192.168.0.11"; // ログのファイル名 PATH = "aaa.csv"; ) func get_ip_list() (*vector.StringVector){ // 動的配列を用意 ip_list := new(vector.StringVector); // 通信先IPアドレス ip_list.Push("192.168.0.3"); ip_list.Push("192.168.0.4"); ip_list.Push("192.168.0.5"); ip_list.Push("192.168.0.6"); ip_list.Push("192.168.0.7"); ip_list.Push("192.168.0.8"); ip_list.Push("192.168.0.9"); ip_list.Push("192.168.0.10"); return ip_list; } func main(){ fp, _ := os.Open(PATH, os.O_RDONLY, 0); // 読み込みで開く dir, _ := fp.Stat(); // ファイル情報取得 ip_list := get_ip_list(); // IPのリスト fp_list := make(map[string] *os.File, 10); // ハッシュ buf := make([]byte, dir.Size); // ファイルサイズ分のバッファを用意 fp.Read(buf); // ファイルを読み込む for ip := range ip_list.Iter() { // ファイルポインタを格納 // 書き込みモードでファイルを作成 fp, _ := os.Open(ip + ".txt", os.O_WRONLY | os.O_CREATE, 500); fp_list[ip] = fp; } str := bytes.NewBuffer(buf).String(); // ファイルのバイト配列を文字列に変換 list := strings.Split(str, "\n", 0); // 文字列を改行で分割 length := len(list); // 配列の要素数 // 正規表現を用意 regs, _ := regexp.Compile(" Len=(1460|0)"); for i := 0; i < length; i++ { line := strings.Split(list[i], "\",\"", 0); // 分割 if len(line) < 5 { continue; } if line[4] != "TCP" { continue; } // TCP通信であること if line[2] == IP || line[3] == IP { // 自身のIPと通信していること if regs.MatchString(line[5]) { // 一致した for ip := range ip_list.Iter() { if line[2] == ip || line[3] == ip { // 送信、または受信が指定のIPアドレスだった場合 // ファイルに書き出す fp_list[ip].WriteString(strings.Join(line, "\",\"") + "\n"); } } } } } // ファイルを閉じる for ip := range ip_list.Iter() { fp_list[ip].Close(); } }
トラックバック - http://d.hatena.ne.jp/heiwaboke/20091223/1261495755
リンク元
- 41 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBF_jaJP273JP274&q=23ch
- 25 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP-mac:official&hs=wXw&q=gvim+mac&btnG=検索&lr=lang_ja&aq=f&oq=
- 21 http://www.google.co.jp/search?hl=ja&source=hp&q=23ch&btnG=Google+検索&lr=
- 15 http://www.google.co.jp/search?hl=ja&source=hp&q=????????????js&lr=&aq=0&oq=???????????
- 15 http://www.google.co.jp/search?q=うんかー&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 14 http://search.yahoo.co.jp/search?p=????????????&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=&oq=
- 13 http://www.google.co.jp/search?hl=ja&source=hp&q=23ch&btnG=Google+検索&lr=&rlz=1R2ADRA_jaJP356&aq=f&oq=
- 13 http://www.google.co.jp/search?hl=ja&source=hp&q=unkar&btnG=Google+検索&lr=&aq=f&oq=
- 13 http://www.google.co.jp/search?q=DOMContentLoaded&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 11 http://b.hatena.ne.jp/entry/unkar.jp/
