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で最初のフィールドを足していき最後に表示。便利で簡単!!!!