1) Давайте сравним следующие две версии:
while sleep 0.1 ; do top -d 10 | grep Cpu ; done
#versus batch mode
while sleep 0.1 ; do top -d 10 -bn1 | grep Cpu ; done
Вы увидите, что в первом примере время определяется интервалом обновления top
(установленным на 10 секунд с помощью -d 10
), а во втором - команда sleep
в цикле while является пределом. Обратите внимание, что также top
никогда не завершается в первом примере, что делает обработку любого конвейерного вывода проблемой, поскольку программа, которая читает из stin
, никогда не получает сигнал «процесс завершен», который особенно проблема для программ на основе столбцов, таких как awk
или cut
. Посмотрите, как, например,
top -d 0.1 -b | grep Cpu | cut -d' ' -f1
не будет производить вывод с интервалами top
производит его, а скорее нерегулярными партиями, тогда как
while sleep 0.1 ; do top -bn1 | grep Cpu | cut -d' ' -f1 ; done
производит вывод с желаемыми интервалами.
Короче говоря: НЕОБХОДИМО использовать while
цикл И top -bn1
2) awk
обработка:
With stin
читать из top -bn1 | grep Cpu
, вы можете использовать:
awk 'BEGIN { FS == " +" } ; { cmd1="date +%Y-%m-%d" ; cmd2="date +%H:%M:%S" ; while ( cmd1 | getline a ) ; while ( cmd2 | getline b) ; print a,b,($2+$4)/($2+$4+$8)*100"%" }'
В качестве BEGIN {FS == "+"}
будет использовать один или несколько ( +
) пробелов в качестве разделителей полей, соответствующие поля для нас, sy и id - 2, 4 и 8 долларов.
Обходной путь с cmd1 = "..."; while (cmd1 | getline a)
необходимо для чтения результата системного вызова как переменной в awk. См. Ответ @ ghostdog74 здесь