О2, о4 и о5 ничего не значат. Похоже, они должны быть переменными, но переменные устанавливаются после расчета. Если вы хотите использовать переменную, вы должны установить ее, прежде чем использовать.
Вот более простой расчет, чтобы проиллюстрировать проблему. Я хочу добавить два номера.
$ echo 6 4 | awk '{ print $1 + $2 }'
10
$ echo 6 4 | awk '{
print o1 + o2 # print the sum of two numbers using unset variables
print o1, o2 # print the unset variables
o1=$1 # set the variables
o2=$2
print o1, o2 # print the set variables
}'
0
6 4
awk решает использовать 0 для представления неустановленного значения в расчете.
Глядя на вычисление процессора, он, по сути, делает следующее:
(0 + 0 - x - y) * 100 / (0 + 0 - x - y - z)
В итоге вы получите отрицательное число, разделенное на отрицательное число, в результате получится положительное число.
В этом случае было бы достаточно следующего:
$ grep -w cpu /proc/stat | awk '{ print ($2+$4)*100/($2+$4+$5) "%" }'