awkコマンド

awk(おーく)コマンドについて

ns2やns3を使用していると、トレースファイルから必要な情報を取り出したい場面が出てきます。
そんなとき便利なコマンドがawkです。awkは、入力データ1行ごとに各列の様々な処理を行うコマンドです。

使い方

awk '条件文{実行文}' 入力ファイル 

実際に使ってみる


上図は、ノード0とノード1がノード2を経由してノード3へUDPでパケットを送信している様子です。
以下のようなns2のトレースファイル(out.tr)に対してawkコマンドを使ってみます。
目標は、「ノード3がパケットを受信する時間と、パケットサイズをトレースファイルから取り出すこと」です。

...
+ 1.01 1 2 cbr 500 ------- 2 1.0 3.0 2 104
- 1.01 1 2 cbr 500 ------- 2 1.0 3.0 2 104
+ 1.01 0 2 cbr 500 ------- 1 0.0 3.0 102 105
- 1.01 0 2 cbr 500 ------- 1 0.0 3.0 102 105
r 1.013 2 3 cbr 500 ------- 1 0.0 3.0 97 97
r 1.014 1 2 cbr 500 ------- 2 1.0 3.0 0 100
+ 1.014 2 3 cbr 500 ------- 2 1.0 3.0 0 100
- 1.014 2 3 cbr 500 ------- 2 1.0 3.0 0 100
r 1.014 0 2 cbr 500 ------- 1 0.0 3.0 100 101
+ 1.014 2 3 cbr 500 ------- 1 0.0 3.0 100 101
+ 1.015 1 2 cbr 500 ------- 2 1.0 3.0 3 106
- 1.015 1 2 cbr 500 ------- 2 1.0 3.0 3 106
+ 1.015 0 2 cbr 500 ------- 1 0.0 3.0 103 107
- 1.015 0 2 cbr 500 ------- 1 0.0 3.0 103 107
- 1.018 2 3 cbr 500 ------- 1 0.0 3.0 100 101
r 1.018 2 3 cbr 500 ------- 1 0.0 3.0 98 98
r 1.019 1 2 cbr 500 ------- 2 1.0 3.0 1 102
+ 1.019 2 3 cbr 500 ------- 2 1.0 3.0 1 102
r 1.019 0 2 cbr 500 ------- 1 0.0 3.0 101 103
+ 1.019 2 3 cbr 500 ------- 1 0.0 3.0 101 103
+ 1.02 1 2 cbr 500 ------- 2 1.0 3.0 4 108
- 1.02 1 2 cbr 500 ------- 2 1.0 3.0 4 108
...

行の1列目に注目してみると、r,+,-の3つが見られます。それぞれの意味は以下のとおりです。

    • 'r' 受信(receive)
    • '+' エンキュー
    • '-' デキュー

また、トレースファイル(out.tr)の2列目は、時間を表してます。3列目と4列目では、パケットの送信元ノードとパケットの送信先ノードをそれぞれ示しています。5行目はCBR(Constant Bit Rate)を示し、6行目はパケットサイズを示しています。
したがって、まず1列目が'r'であり、かつ4列目が'3'であるような行を選択すればいいことがわかります。
これをawkコマンドを使って表現すると、

awk '{if($1 == "r" && $4 =="3") print $2,$6}' out.tr

上記コマンドは、トレースファイル(out.tr)から1列目($1)が'r'であり、かつ4列目($4)が'3'である行から、2列目(時間)と6列目(パケットサイズ)を出力するコマンドです。
※print $○,$○,...,$○という感じで','(カンマ)で各要素を区切らなければ、syntax errorとなります。
出力結果は以下のようになりました。

...
1.013 500
1.018 500
1.023 500
1.028 500
1.032 500
1.036 500
1.04 500
1.044 500
1.048 500
1.052 500
1.056 500
1.06 500
...

このawkコマンドを使用することで、gnuplotで図を表示してみたり、スループットを求めてみたりなど多くのことに役立てることができます。
以上、ns2の有線ネットワークのトレースファイルからパケットサイズの情報を取り出してみましたが、トレースファイルの形式が異なる無線ネットワークのトレースファイルも同様にして扱うことができます。