Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I would like to know which command I use the most on the command line. I would like to know so I can improve my use of the command line. If I know which command I use the most, I can then read more about them try and figure out better ways to use them.

I know history keeps a list of all the previous commands I typed. How would I process it to see a list of the top 10 or 20 most used commands.

share|improve this question
    
Yes I did just post this question to answer it. It is just so interesting that I though the superuser community would really find it interesting. – nelaar Feb 25 '11 at 12:12
1  
Nothing at all wrong with posting questions to answer yourself. It makes a handy bookmark, and if you're on the wrong track you'll soon hear about it! – Ken Jul 8 '11 at 14:31
up vote 29 down vote accepted

I just saw this post on http://linux.byexamples.com/

Basically you use a simple one line awk script

history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10

A full explanation can be found at the link above.

Example of out put on my machine is:

 1  211  21.1%  ls
 2  189  18.9%  sudo
 3  58   5.8%   man
 4  52   5.2%   cd
 5  43   4.3%   ping
 6  40   4%     apropos
 7  34   3.4%   less
 8  22   2.2%   cat
 9  18   1.8%   which
10  18   1.8%   aspell
share|improve this answer
    
On my OSX, the output of history is different, so I just needed to change the first $2 to $4 and this works. – Liam May 10 at 21:40
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

The awk command will print the first string from ~/.bash_history (not showing command options or arguments), then sort will order all lines alphabetically, then "uniq -c" will remove duplicated lines (your typed commands) and count them, and the last sort will order your commands by the count number returned by uniq.

share|improve this answer

You can use the hash command in your terminal, which keeps a hash entry of every command that you use along with the number of hits and based on the hits you can sort them out and process.

Check this article for more information.

share|improve this answer

For a more general answer, enable "process accounting" on your system. You can get not just frequency of use, but aggregate CPU, memory, and I/O stats.

share|improve this answer
    
That is very use full. – nelaar Feb 25 '11 at 14:00

The scripts in the other answers only count the first command executed in each command line; they do not include commands executed after pipes (i.e. ' | '). For example, if this line itself was in your bash history:

awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -n

then in the returned summary of most-executed commands, 'sort' and 'uniq' and the second 'sort' would not be included, as they weren't the first token in the line.

Building on the answer from nelaar, it suffices to first split the lines in your bash history on every pipe:

sed 's/|/\n/g' ~/.bash_history | awk '{CMD[$1]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10
share|improve this answer

Use $ history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10 to get a list of your top 10 commands.

Example:

 1  272  27.2%  svn
 2  227  22.7%  cd
 3  159  15.9%  sudo
 4  57   5.7%   ll
 5  52   5.2%   mc
 6  32   3.2%   rm
 7  23   2.3%   mkdir
 8  19   1.9%   exit
 9  13   1.3%   subl
10  13   1.3%   find
share|improve this answer

You can fashion the above awk answer from @nelaar into a nice bash script:

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n10
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.