awk,cut,sortが便利という話。

こんにちはゆとりです。
今さらだけど突然のTwitter砲にもなんとか耐えたさくらVPSに感謝するawk,cut,sort,uniqの組み合わせやばいなーって思ってた。思ってたけどまぁあんま使わないかな〜なんて思ってた。ゆとりなので。

で、昨日の話の続きなんだけど

screen -ls

が64bit環境でクソ遅い(Cygwinで)という話。
straceでプロセスのシステムコールを監視してみた。

$ strace -o screenls.log screen -ls
   12      12 [main] screen 3536 open_shared: name shared.5, n 5, shared 0x60FB0000 (wanted 0x60FB0000), h 0xFC
  141     153 [main] screen 3536 heap_init: heap base 0x980000, heap top 0x980000
   59     212 [main] screen 3536 open_shared: name S-1-5-21-2837750084-2915258791-2104323118-1000.1, n 1, shared 0x60FC0000 (wanted 0x60FC0000), h 0x100
   38     250 [main] screen 3536 user_info::create: opening user shared for 'S-1-5-21-2837750084-2915258791-2104323118-1000' at 0x60FC0000
...

みたいなログが出た。
一番左の実行時間(マイクロ秒)でソートとか合計値の確認したいな〜って思ったときに上のエントリを思い出したので実践。

とりあえず実行時間でソート

$ cat screenls.log | sort -n > screenls_sort.log

sort -nで文字列を数値とみなしてソートしたのをscreenls_sort.lgoに書きだす
結果としては

  -31 5223784 [sig] screen 3536 wait_sig: saw __SIGEXIT
    5   30295 [sig] screen 3536 wait_sig: entering ReadFile loop, my_readsig 0x120, my_sendsig 0x124
   12      12 [main] screen 3536 open_shared: name shared.5, n 5, shared 0x60FB0000 (wanted 0x60FB0000), h 0xFC

ちゃんと数値の順にソートされてる。便利。
cat screenls.logはawk '{print $0}' screen-ls.logと書き換えられるけど面倒くさいので全部使いたいときはcatのが簡単。

次に実行時間の合計値を出してみよう。

$ awk '{total = total + $1 } END{print total}' screenls.log
5224348

awkで最初のフィールドを足していき最後に表示。便利で簡単!!!!