Using /proc/stat to calculate CPU usage
Nice script :-)

getstat is a bit odd:


It runs a grep and then a sed, when probably a single sed (or awk) could do the job
It replaces spaces with x, but not very clear why:

I see that extract uses x as the separator, but it could just as well use space for that
I also see that using x as the separator makes the change function slightly simpler, because it lets you write extract $ENDSTAT instead of extract "$ENDSTAT", but then again, having to quote doesn't seem a big problem



In extract, you run an echo and then a cut:


echo $1 | cut -d 'x' -f $2



In bash you can use here strings, which is better than using echo:

cut -d 'x' -f $2 &lt;&lt;&lt; $1


But actually, if we keep the spaces as the separator in getstat, then we can rewrite both of these functions with fewer extra processes:

function getstat() {
    sed -ne '/^cpu  */s/^cpu  *//p' /proc/stat
    # that is:
    # -n to not print lines by default
    # for lines matching /^cpu  */, delete /^cpu  */, and print the line
}

function extract() {
    # example 1st param: "437797 1219 185341 549955584 58662 4 7083 0 0 0"
    # example 2nd param: 1, 2, 3, ... (the n-th column to use)
    n=$2          # saving the position param
    set -- $1     # reset positional params from $1, so that $1=437797, $2=1219, ...
    echo ${!n}    # echo the n-th positional param
}

function change() {
    local e=$(extract "$ENDSTAT" $1)
    local b=$(extract "$STARTSTAT" $1)
    echo $(( $e - $b ))
}