8.5 打印出10条最常使用的命令

终端是用来访问shell的工具,在shell中我们可以输入并执行命令。用户要在shell中运行很多命令,其中某些命令使用得比较频繁。用户的使用习惯可以通过查看其经常使用的命令轻松地得以确认。这则攻略是一个小练习:找出10条最常使用的命令。

8.5.1 新手上路

Bash跟踪用户之前输入过的命令,并将其存储在文件 ~/.bash_history中。不过,它只保留特定数量(例如500)的最近执行过的命令。可以用命令histroycat ~/.bash_history查看命令历史记录。我们就用这种方法来找出频繁使用的命令。

8.5.2 实战演练

我们可以从 ~/.bash_history中获得命令列表,只需要命令名称即可,而不需要命令参数,接着统计每条命令的出现次数,然后找出出现次数最多的10条命令。

实现脚本如下:

  1. #!/bin/bash
  2. #文件名: top10_commands.sh
  3. #用途: 列出最常使用的10条命令
  4. printf "COMMAND\tCOUNT\n" ;
  5. cat ~/.bash_history | awk '{ list[$1]++; } \
  6. END{
  7. for(i in list)
  8. {
  9. printf("%s\t%d\n",i,list[i]); }
  10. }'| sort -nrk 2 | head

输出样例:

  1. $ ./top10_commands.sh
  2. COMMAND COUNT
  3. ping 80
  4. ls 56
  5. cat 35
  6. ps 34
  7. sudo 26
  8. du 26
  9. cd 26
  10. ssh 22
  11. sftp 22
  12. clear 21

8.5.3 工作原理

在上面的脚本中,用 ~/.bash_history作为源文件。通过管道将源输入传递给awk。在awk中,我们使用了一个关联数组。这个数组将命令名作为索引,将命令出现的次数作为数组元素值。命令每出现一次,计数值增加1list[$1]++)。$1是输入文本行的第一个单词。如果使用$0,则包含输入文本行中所有的单词。比如说,如果ssh 192.168.0.4.bash_history其中的一行,那么 $0中包含 ssh 192.168.0.4$1中包含ssh

1 在shell和awk中,都有一个特殊变量 $0。尽管变量名相同,但是含义却不同。对于shell来说,$0中包含的是命令行的第一个单词,也就是命令名。对于awk来说,$0中包含当前记录。

一旦对命令历史文件中的所有行遍历完毕,我们就得到了一个数组,其中数组索引是命令名称,数组元素值是命令出现的次数。因此出现次数最多的命令名称就是使用最频繁的命令。在awk的END{ } 语句块中,我们遍历关联数组,打印出所有的命令名及其对应的出现次数。sort-nrk 2对第2列(COUNT)按照数值逆序排序。最后用head命令从列表中提取出前10条命令。你可以用head -n NUMBER将前10条命令改为前5条或是其他任意数量。