cutとawkの速度
ログファイルを参照して特定のリクエストに関してソースIPアドレスをカウントして欲しいとのリクエスト。
grepとawkとuniq -cのワンライナーでまぁ速攻でやっつけました。ところで標準出力でもファイルでも特定のフィールドを切り出すときに私はいつもawkを使っています。
CLFでソースIPアドレスを切り出すならこんな感じですね。
$ cat http_access_201410* | awk '{print $1}'
UNIXコマンドにはcutってのもあって、上記と同等の動作ならば
$ cat http_access_201410* | cut -d' ' -f1
どっちでもいいんですが、技術者一年目の時に覚えたのがawkで、文法的にもわかりやすいし切り出しだけじゃなくていろんなことができるのでawkを使ってるんですね。
今日ふと気になりました。どっちが早いんだろう。早速計測。昨月のアクセスログからソースIPアドレスを切り出してみます。
cutの結果。上記コマンドをtimeに喰わせた結果です。対象行数は約2550万行。
real 4m25.531s user 4m8.726s sys 0m13.110s
awkの結果。
real 0m27.784s user 0m18.832s sys 0m8.754s
ほー、これは意外。単純(だと思われる)なcutの方が早いんだろうと予想していたら、意外にもawkの圧勝。これからも安心してawkを使い続けることにします。さすがはカーニハン博士。