Answers:
我刚刚在http://linux.byexamples.com/上看到了这篇文章
基本上,您使用一个简单的awk行脚本
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
在上面的链接中可以找到完整的解释。
在我的机器上放出的示例是:
1 211 21.1% ls
2 189 18.9% sudo
3 58 5.8% man
4 52 5.2% cd
5 43 4.3% ping
6 40 4% apropos
7 34 3.4% less
8 22 2.2% cat
9 18 1.8% which
10 18 1.8% aspell
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n
awk命令将打印〜/ .bash_history中的第一个字符串(不显示命令选项或参数),然后sort将按字母顺序对所有行进行排序,然后“ uniq -c”将删除重复的行(您键入的命令)并对其进行计数,然后最后一种排序将按照uniq返回的计数顺序对命令进行排序。
-r
在命令末尾添加以相反的顺序对它们进行排序并| head -10
限制结果的数量。
其他答案中的脚本仅统计在每个命令行中执行的第一个命令;它们不包括在管道后执行的命令(即“ |”)。例如,如果此行本身在您的bash历史记录中:
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n
然后,在返回的大多数执行命令的摘要中,将不包括“ sort”和“ uniq”以及第二个“ sort”,因为它们不是该行中的第一个标记。
基于nelaar的答案,首先在每条管道上的bash历史记录中分割行就足够了:
sed 's/|/\n/g' ~/.bash_history | awk '{CMD[$1]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
一个有趣的补充是条形图的计数:
history | tr -s ' ' | cut -d ' ' -f3 | sort | uniq -c | sort -n | tail | perl -lane 'print $F[1], "\t", $F[0], " ", "▄" x ($F[0] / 12)'
输出:
man 226 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
cat 230 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
rm 235 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
ls 240 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
aura 273 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
mv 362 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sudo 534 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
vi 611 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
git 693 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
cd 754 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
长命令将偏移间距。
printf
或sprintf
代替print
。
使用$ history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
让您的排名前10位的命令列表。
例:
1 272 27.2% svn
2 227 22.7% cd
3 159 15.9% sudo
4 57 5.7% ll
5 52 5.2% mc
6 32 3.2% rm
7 23 2.3% mkdir
8 19 1.9% exit
9 13 1.3% subl
10 13 1.3% find