如何查看最常用的linux命令是什么?


43

我想知道我在命令行上使用最多的命令。我想知道,因此我可以改善命令行的使用。如果我知道我使用最多的命令,则可以阅读有关它们的更多信息,并尝试找出使用它们的更好方法。

我知道历史记录保留了我键入的所有先前命令的列表。我将如何处理它以查看前10或20个最常用命令的列表。


是的,我只是发布了这个问题来回答它。真是太有趣了,尽管超级用户社区真的会觉得它很有趣。
nelaaro 2011年

1
发表问题回答自己没有任何问题。它使书签变得很方便,如果您走错了轨道,很快就会听到有关它的信息!

Answers:


59

我刚刚在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

3
在我的OSX上,历史记录的输出是不同的,因此我只需要将第一个$ 2更改为$ 4即可。
利亚姆

17
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

awk命令将打印〜/ .bash_history中的第一个字符串(不显示命令选项或参数),然后sort将按字母顺序对所有行进行排序,然后“ uniq -c”将删除重复的行(您键入的命令)并对其进行计数,然后最后一种排序将按照uniq返回的计数顺序对命令进行排序。


您也可以-r在命令末尾添加以相反的顺序对它们进行排序并| head -10限制结果的数量。
ROMANIA_engineer 2016年

10

您可以hash在终端中使用该命令,该命令将保留您所使用的每个命令的哈希条目以及命中数,并基于命中可以对它们进行排序和处理。

查看本文以获取更多信息。


8

有关更一般的答案,请在系统上启用“ 过程记帐 ”。您不仅可以获取使用频率,还可以获取CPU,内存和I / O统计信息的总和。


6

其他答案中的脚本仅统计在每个命令行中执行的第一个命令;它们不包括在管道后执行的命令(即“ |”)。例如,如果此行本身在您的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

6

一个有趣的补充是条形图的计数:

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 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄

长命令将偏移间距。


关于如何使长命令不偏移间距的任何想法吗?
Ashish Ahuja,

@fortunate_man不幸的是,但是我对perl不太熟悉,因此如果您将其作为一个新问题来回答,您将很可能得到答案。我尝试搜索如何打印固定宽度,但没有立即找到任何帮助,功能文档也没有太大帮助。您可能需要使用printfsprintf代替print
joelostblom

2

使用$ 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

这与接受的答案有何不同?
Ashish Ahuja,

1

您可以将上述awk答案从@nelaar转换为漂亮的bash脚本:

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
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

好吧,这是命令“НеделчоХристов”的修改版本,已复制并粘贴到此处。...如果您对bash历史记录进行了保护或加盖了日期戳,那么输出将有问题

这样可以使您更好:

awk '{CMD[$1]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' .bash_history | grep -v "#" | sort -nr | nl | column -c3 -s " " -t | head -n 20
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.