unixコマンドの使用頻度を計測する

背景

2015年08月に書きました.

大学で「unixコマンドの自分用のマニュアルを書け」という正直言って謎な課題が出たためです.そのためにまず自分の使っているコマンドを計測するために.zsh_historyの内容を解析することにしました.最初は当初学んでいたerlangで解析しようとしましたが,文字列操作がわけわかめで疲れてやめました.

ソースコード

純粋なunixコマンドだけではなくaliasfunctionも計測したいため,自分のncaq/.zsh.dを読み込んで,定義されてあるコマンドやaliasをまず抽出するようにしてあります.当初はzsh側でtypeで存在を確認しようと思いましたが,どう考えても重すぎるため却下.その後にhistoryのテキストを単語ごとに分割してコマンドっぽいものを抽出すれば,sudoで指定されたaliasも出て良い.

実行結果

これを書いた当時の実行結果

7357: "eix"
7150: "ll"
3803: "sudo"
2517: "p"
1739: "git"
1467: "t"
1377: "echo"
1339: "m"
1312: "make"
1292: "man"
1229: "cat"
1221: "ssh"
930: "equery"
803: "gs"
781: "u"
648: "mv"
620: "rm"
614: "ag"
573: "f"
562: "parallel"
553: "tree"
550: "install"
534: "cp"
521: "eselect"
507: "ls"
454: "z"
438: "sds"
418: "ip"
375: "mount"
354: "firefox"
342: "find"
341: "cabal"
332: "x"
317: "systemctl"
315: "c"

現在の実行結果

% runhaskell CommandRank.hs|head -n 50
stty: 標準入力: デバイスに対する不適切なioctlです
stty: 標準入力: デバイスに対する不適切なioctlです
stty: 標準入力: デバイスに対する不適切なioctlです
1018: "stack"
905: "ll"
543: "eix"
376: "p"
366: "sudo"
364: "ruby"
294: "d"
255: "npm"
199: "gs"
169: "m"
148: "git"
139: "echo"
134: "t"
133: "nmcli"
115: "w"
109: "off"
105: "x"
102: "equ"
98: "c"
97: "eselect"
88: "make"
85: "mv"
72: "install"
67: "ghc"
65: "rm"
57: "sdr"
54: "NetworkManager"
53: "tree"
50: "yesod"
49: "mudn"
49: "pactl"
48: "cp"
46: "ge"
44: "mudnbw"
44: "pavucontrol"
39: "ag"
39: "cat"
39: "eix-sync"
39: "test"
37: "gp"
37: "mosh"
36: "u"
35: "ga"
35: "gc"
35: "mikutter"
33: "emacs"
33: "fc-match"
31: "ghci"
31: "mount"
30: "tidy"
CommandRank.hs: <stdout>: hPutChar: resource vanished (Broken pipe)

解析評価

明らかにコマンドラインパラメータなのが混ざっているのはご愛嬌.こうしてみると,大部分は設定したaliasと一部の開発用ツールでコマンドは埋まっていることがわかります.2年前と使ってるツールはあまり変わってないですね,cabalstackに変化したのが1番大きな変化でしょうか.unixは枯れていて,そこが魅力です.