Skip to main content
2 of 2
added 14 characters in body
janos
  • 113.1k
  • 15
  • 154
  • 396

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 <<< $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 ))
}
janos
  • 113.1k
  • 15
  • 154
  • 396