summaryrefslogtreecommitdiffstats
path: root/bin/history-stats
blob: 0fead1f3b406658bdd6f2ae49865adfc3beb9020 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env perl
use strict;
use warnings;

use Getopt::Long;

my $history_file = $ENV{SHELL} =~ m{/zsh} ? '.zsh_history' : '.bash_history';

open my $fh, '<', "$ENV{HOME}/$history_file"
    or die "couldn't open $ENV{HOME}/$history_file: $!";
my $n = 10;
my $subcommand;
GetOptions(
    'n=i'          => \$n,
    'subcommand=s' => \$subcommand,
);

my %cmds;
my %sudo_cmds;

while (<$fh>) {
    chomp;

    # strip zsh history timestamps
    s/^[^;]*;// if /^:/;

    s/^\s*(.*?)\s*$/$1/;
    my @words = split /\s+/;
    next unless @words;
    shift @words while @words && $words[0] =~ /^[A-Z][A-Z0-9_]*=/;
    next unless @words;
    my $sudo;
    if ($words[0] eq 'sudo') {
        $sudo = 1;
        shift @words;
    }
    if ($subcommand) {
        next unless $words[0] eq $subcommand;
        shift @words;
        shift @words while @words && $words[0] =~ /^-/;
    }
    $cmds{($words[0] || '')}++;
    $sudo_cmds{$words[0]}++ if $sudo;
}

for my $cmd (sort { $cmds{$b} <=> $cmds{$a} } keys %cmds) {
    printf '%5d %s', $cmds{$cmd}, $subcommand ? "$subcommand $cmd" : $cmd;
    printf ' (%d under sudo)', $sudo_cmds{$cmd} if $sudo_cmds{$cmd};
    print "\n";
    last unless --$n;
}