Answers:
而是取决于“命令”的意图。从一个角度看的命令仅仅是通过命令行调用可执行文件,因此,ls
和ls -alh /tmp/foo/bar/*tar.bz
是两个命令ls
。另一个观点是,命令是其各个部分的总和,这意味着上面的示例是2个不同的命令。
如果您打算在历史记录中计算完全唯一的命令,则可以执行: history | cut -d' ' -f4- | uniq -c | sort -n
请注意,这已经在Debian系统上进行了测试,您的history命令的输出语法可能会略有不同。在命令中调整数字“ 4”以选择备用列。
如果只考虑第一个不带参数的命令,则可以执行: history | cut -d' ' -f4- | cut -d' ' -f1 | uniq -c | sort -n
要包含参数,但不包括后面的任何链接或管道命令,可以执行以下命令: history | cut -d ' ' -f4- | cut -d'|' -f1 | uniq -c | sort -n
请注意,这些命令中的每一个都按数字顺序对频率最高的命令数进行排序。
sort
前uniq
得到一个准确计数,因为它只检查相邻线路:history | cut -d' ' -f4- | cut -d' ' -f1 | sort | uniq -c | sort -n
另一种方法是使用BSD进程记帐,它在Linux上也可用(尽管我不知道默认情况下是否启用了它)。只要记帐处于活动状态,它基本上都会保留所有正在运行的程序(以及其他一些措施,例如消耗的CPU时间等)的选项卡。从那里可以得到一些汇总统计信息,其中包括:系统上曾经运行过的所有程序的列表的种类,按用途等排序。
要查找的命令lastcomm
用于运行中的日志和sa
汇总的统计信息。回到原始问题,假设有问题的系统自安装以来就已经启用了记帐,然后sa -n
将给出系统上曾经执行过的所有命令(对于所有用户)的列表,并按频率排序。对于管道,管道的每个部分当然将被分别计算,因为每个部分都包括要分叉的新过程。
有关更多详细信息,Linux期刊上有一篇文章介绍了其工作原理。我本人从NetBSD指南中得到了这个主意;其中的许多更通用的管理技巧并非特定于NetBSD,而是也适用于其他Unix系统。