いや、なんというかawkは超高機能で、複雑な集計処理とかも出来るわけです。
それにも関わらず基本的な使い方は、半角スペース区切りの文字列切り出しだけだったりします。 そうこんな感じ
1 | $ cat access_log | awk '{print $3,$5}' |
きっとベテランエンジニアは「( ゚д゚ )クワッ!!文字列の切り出しは、cutを使え!」とか言うに違いない。
きっと、今日も明日も僕はディスられるに違いない! でも、本当のところ、速度的にはどうなんだろう?
awkとcutはどっちが早いのか?いっちょ、やってみよう。
実験条件
- 10万行のアクセスログ
- IPアドレスとURLを抜き出す
- 対象のログファイルは、テスト試行回数分の同じファイルを用意して、ファイルがメモリに載ってない状態で揃える。
- cutのバージョンは => cut (GNU coreutils) 5.97
- awkのバージョンは => GNU Awk 3.1.5
実験コマンド
awk
1 | time cat access_log | awk '{print $1,$7}' > /dev/null |
cut
1 | time cat access_log | cut -d ' ' -f1,7 > /dev/null |
※ターミナルへの描画で時間がかかる事を考慮して/dev/nullへリダイレクトした。
実験結果
コマンド | 1回目 | 2回目 | 3回目 |
---|---|---|---|
cut | 5.648s | 5.293s | 8.811s |
awk | 0.676s | 0.364s | 0.677s |
考察
cutクソ遅ぇ。
と言うわけで、どんなにディスられても、私は今後も文字列切り出しにawkを使います。
しかし、何故にこんなに速度差が出るのだろう。cutのソースコードを写経してみようかな・・・(-_-;)