一个shell脚本的分析(1)
1 显示最常用的命令
1.1 原始脚本
$ history | \ > awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | \ > sort -rn | \ > head -n 10
从上面可以看出来,这个脚本分为五步,最核心的就是awk处理的那块。
首先,history命令列出存储在~/.bashhistory中存储的所有命令,其基本格式如下:
~$ history | head -n 1 1 rm -r test/
接着,使用awk处理。我们仔细分析一下,在awk中,它首先将每个记录的第二个字段作为数组的下标,接着加1。每次遇到同样的字段,就自加1。这样a[]中存着每个命令的出现次数。当awk处理完毕所有记录后,进入END。END块打印数组和它的值,其格式如下:
~$ history | awk '{a[$2]++} END{for(i in a){print a[i] " " i}}' | head -n 3 2 ln 1 ./backup 1 grep
其中第一个字段表示该命令出现的次数。
当awk将所有的命令处理完毕之后,将其重定向到sort,由sort进行排序。sort -rn 意思就是以数字进行正向排序。
最后,由head命令输出前十个常用命令。
输出结果:
97 ls 78 history 71 cd 19 cat 18 echo 15 gcc 11 man 10 passwd 8 sed 6 ./guanji
1.2 改进后
$ history | \ > sed 's/\.\///' | \ > awk '{a[$2]++}END{for(i in a){print a[i] "\t" i "\t" a[i]/$HISTSIZE "%"}}' | \ > sort -rn | \ > head -n 10
其输出如下:
97 ls 0.235437% 76 history 0.184466% 71 cd 0.17233% 19 cat 0.0461165% 18 echo 0.0436893% 15 gcc 0.0364078% 11 man 0.026699% 10 passwd 0.0242718% 8 sed 0.0194175% 6 guanji 0.0145631%
1.2.1 改进项目
1.使用sed去掉./开头的命令
2.显示每个命令的使用频率
3.使用\t使输出更加美观