8.5 打印出10条最常使用的命令
终端是用来访问shell的工具,在shell中我们可以输入并执行命令。用户要在shell中运行很多命令,其中某些命令使用得比较频繁。用户的使用习惯可以通过查看其经常使用的命令轻松地得以确认。这则攻略是一个小练习:找出10条最常使用的命令。
8.5.1 新手上路
Bash跟踪用户之前输入过的命令,并将其存储在文件 ~/.bash_history中。不过,它只保留特定数量(例如500)的最近执行过的命令。可以用命令histroy
或cat ~/.bash_history
查看命令历史记录。我们就用这种方法来找出频繁使用的命令。
8.5.2 实战演练
我们可以从 ~/.bash_history中获得命令列表,只需要命令名称即可,而不需要命令参数,接着统计每条命令的出现次数,然后找出出现次数最多的10条命令。
实现脚本如下:
#!/bin/bash
#文件名: top10_commands.sh
#用途: 列出最常使用的10条命令
printf "COMMAND\tCOUNT\n" ;
cat ~/.bash_history | awk '{ list[$1]++; } \
END{
for(i in list)
{
printf("%s\t%d\n",i,list[i]); }
}'| sort -nrk 2 | head
输出样例:
- $ ./top10_commands.sh
- COMMAND COUNT
- ping 80
- ls 56
- cat 35
- ps 34
- sudo 26
- du 26
- cd 26
- ssh 22
- sftp 22
- clear 21
8.5.3 工作原理
在上面的脚本中,用 ~/.bash_history作为源文件。通过管道将源输入传递给awk。在awk中,我们使用了一个关联数组。这个数组将命令名作为索引,将命令出现的次数作为数组元素值。命令每出现一次,计数值增加1
(list[$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条或是其他任意数量。