呃,其實這是一個很久很古老的話題了。之所以拿來寫篇博客,是爲了讓自己一定一定要記住cut/sort/uniq/tr/sed
的用法,別再忘了……(拜託我自己,記性好點兒吧……)
首先,查看自己所有用過的命令歷史記錄,發現只有這一點兒……
lgl@pArch ~ $ cat .bash_history
pacman -S zsh
sudo pacman -S zsh
exit
cd /home/lgl
clear
ls
exit
恩,我是一開始就裝了zsh,後來就不用bash了……所以我應該查看.zsh_history來着。
: 1442485127:0;ls
: 1442485132:0;exit
: 1442485144:0;sudo pacman -Syu
: 1442485151:0;exit
: 1442485188:0;sudo pacman -S texlive-lang
: 1442485439:0;pacman -Ss font
: 1442485537:0;pacman -S wqy-microhei
: 1442485544:0;sudo pacman -S wqy-microhei
: 1442485562:0;sudo pacman -Ss ttf
......
對,就是它,但是在命令前面怎麼有一堆奇奇葩葩的東西……還是先搞掉吧。
最開始,我想使用cut把命令那一塊兒切出來,但是cut的delimiter不支持多種,沒辦法,先用sed把所有的冒號和分號都換成空格:
lgl@pArch ~ $ sed 's/[:;]/ /g' .zsh_history | head
1442485127 0 ls
1442485132 0 exit
1442485144 0 sudo pacman -Syu
1442485151 0 exit
1442485188 0 sudo pacman -S texlive-lang
1442485439 0 pacman -Ss font
1442485537 0 pacman -S wqy-microhei
1442485544 0 sudo pacman -S wqy-microhei
1442485562 0 sudo pacman -Ss ttf
1442485584 0 sudo pacman -S ttf-arphic-ukai
沒啥問題,然後再用cut把命令那一塊兒切出來:
lgl@pArch ~ $ sed 's/[:;]/ /g' .zsh_history | cut -d ' ' -f 5 | head
ls
exit
sudo
exit
sudo
pacman
pacman
sudo
sudo
sudo
也沒問題,再用uniq -c
(-c count)去重並統計頻率,由於uniq只能去重連續的行,所以要先用sort -d
(-d dictionary)按照字典序把整體排一下,相同行就變成連續的了,再去重並統計,最後再把統計後的內容按照頻率從大到小(默認是從小到大,所以從大到小排列就是逆序排列了)排序sort -nr
(-n numeric -r reverse),最後用head命令輸出前十個就行了:
lgl@pArch ~ $ sed 's/[:;]/ /g' .zsh_history | cut -d ' ' -f 5 | sort -d | uniq -c | sort -nr | head
1093 sudo
606 ls
517 git
506 exit
463 cd
336 pacman
308 cat
202 shutdown
186 gpg
149 yaourt
用的最多的是sudo
,估計有很大一部分是sudo pacman
,其實本來是用pacman指令啦,不過無所謂了。
另外,在用完sed將冒號和分號全都替換成空格之後,會出現連續的空格,這樣再用cut切命令名的時候將會不方便,所以可以用tr -s ' '
(-s, –squeeze-repeats壓榨重複)將連續的空格“壓榨”成一個空格:
lgl@pArch ~ $ sed 's/[:;]/ /g' .zsh_history | tr -s ' ' | head
1442485127 0 ls
1442485132 0 exit
1442485144 0 sudo pacman -Syu
1442485151 0 exit
1442485188 0 sudo pacman -S texlive-lang
1442485439 0 pacman -Ss font
1442485537 0 pacman -S wqy-microhei
1442485544 0 sudo pacman -S wqy-microhei
1442485562 0 sudo pacman -Ss ttf
1442485584 0 sudo pacman -S ttf-arphic-ukai
這樣的話不會再有連續的空格了,方便多了。當然,如果想數起來更方便,不如把開頭的空格也去掉,使用sed 's/^ //g'
:
lgl@pArch ~ $ sed 's/[:;]/ /g' .zsh_history | tr -s ' ' | sed 's/^ //g' | head
1442485127 0 ls
1442485132 0 exit
1442485144 0 sudo pacman -Syu
1442485151 0 exit
1442485188 0 sudo pacman -S texlive-lang
1442485439 0 pacman -Ss font
1442485537 0 pacman -S wqy-microhei
1442485544 0 sudo pacman -S wqy-microhei
1442485562 0 sudo pacman -Ss ttf
1442485584 0 sudo pacman -S ttf-arphic-ukai
嗯,命令所在的塊兒就是第三塊兒,一目瞭然!
最後,希望我記性好點兒吧……
ps:的確,很多用sudo的場合其實是在使用其他命令,而不是爲了使用sudo命令本身,爲此我們可以把sudo刪掉之後再統計:
lgl@pArch ~ $ cat .zsh_history | sed 's/[;:]/ /g; s/sudo/ /g' | tr -s ' ' | sed 's/^ //g' | cut -d ' ' -f 3 | sort -d | uniq -c | sort -nr | head
984 pacman
615 ls
524 exit
517 git
466 cd
330 cat
234 shutdown
186 gpg
164 cp
159 yaourt
於是pacman果然就是使用頻率第一高的命令了^_^