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;
}
|