I want to see CPU usage.
I used this command :

top -bn1 | grep "Cpu(s)" | 
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | 
           awk '{print 100 - $1}'

But it returns 100%.
What's the correct way?


To get cpu usage, best way is to read /proc/stat file. See man 5 proc for more help.

There is a useful script written by Paul Colby i found here

# by Paul Colby (http://colby.id.au), no rights reserved ;)


while true; do

  CPU=(`cat /proc/stat | grep '^cpu '`) # Get the total CPU statistics.
  unset CPU[0]                          # Discard the "cpu" prefix.
  IDLE=${CPU[4]}                        # Get the idle CPU time.

  # Calculate the total CPU time.

  for VALUE in "${CPU[@]:0:4}"; do

  # Calculate the CPU usage since we last checked.
  echo -en "\rCPU: $DIFF_USAGE%  \b\b"

  # Remember the total and idle CPU times for the next check.

  # Wait before checking again.
  sleep 1

save it to cpu_usage, add execute permission chmod +x cpu_usage and run:


to stop the script, hit Ctrl+c

  • its always showing 0% on tx.2large EC2 instance. What's the issue? while the cloudwatch showing 23% – Himanshu Bansal Nov 26 '19 at 12:57

Why not use htop [interactive process viewer]? In order to install it, open a terminal window and type:

sudo apt-get install htop

Also see man htop for more information and how to set it up.

enter image description here enter image description here


I found a solution which works nicely, here it is:

top -bn2 | grep '%Cpu' | tail -1 | grep -P  '(....|...) id,' 

I am not sure but it looks to me that the first iteration of top with the -n parameter returns some dummy data, always the same in all my tests.

If I use -n2 then the second frame is always dynamic. So the sequence is:

  1. Get the 2 first frames of top: top -bn2
  2. Then from those frames take only the lines that contain '%Cpu': grep '%Cpu'
  3. Then only take the last occurrence/line: `tail -1``
  4. Then get the idle value ( has 4 or 5 chars, a space, "id,"): grep -P '(....|...) id,'

Hope it helps, Paul

enter image description here

  • 1
    Not really "dummy data", but yes, the first iteration of top has no previous sample to compare its data to, hence the apparent nonsense. See this comment. – Campa Apr 16 '18 at 8:09

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