zsh-history からコマンドの実行回数を出す

何度か書いているのですが、書き直してみました。書き方のスタイルが変わっていってます。(^^;
元ネタは以下のものです。

ここで、'setopt share_history' されている場合に ';' 前を削除しているのですが、かなり決め打ちです。このままでは最長一致でマッチする箇所を引っ掛けてしまいますので、実際には zsh の仕様を把握した上で作りこむ必要があるでしょう。

#! /usr/bin/gawk -f
# zsh_stat.awk - stat history of zsh
#   input:  ~/.zsh_history
#   output: stat result of ~/.zsh_history
# usage: gawk -f zsh_stat.awk

BEGIN {

    # set ~/.zsh_history
    zsh_hist_file = ENVIRON["HOME"] "/.zsh_history";

    # read ~/.zsh_history
    while (getline < zsh_hist_file > 0) {
        if ($1 == ":") {
            sub(/^.*[0-9];/, "");
        }
        comm_hist[$1]++;
    }
    close(zsh_hist_file);

    # generate array for sorting
    for (i in comm_hist) {
        sort_line[++j] = sprintf("%4d %s", comm_hist[i], i);
    }

    # array sort
    asort(sort_line);

    # print reverse
    for (i = j; i > 0; i--) {
        print sort_line[i];
    }
}

実行結果はこんな感じでした。

$ gawk -f zsh_stat.awk | head
 265 sudo
 113 cd
  53 gawk
  44 ls
  44 less
  44 cat
  38 wget
  38 rm
  37 emacs
  35 mplayer

Pocketworkstation の立ち上げ中ということもあり、sudo が圧倒的でした。