Если вы хотите использовать awk
:
awk 'BEGIN {RS="\n|\\||;|\\$\\("}
$1 ~ /^[0-9]+\./ {print $2; next}
{print $1}' file | sort | uniq
Объяснение : Сообщите awk, что вашим разделителем записей может быть новая строка ИЛИ "|", ИЛИ ";", ИЛИ "$ (", таким образом передаваемые по конвейеру, заменяемые или связанные команды разделяются на записи. Затем проверьте, является ли ваше первое поле числом, за которым следует точка, если да, то вы в начале строки, поэтому выведите второе поле; в противном случае выведите первое поле.
В традициях UTSL я вставил код, выполняющий вычисления. Здесь nrun = sched_load ()
- это общее количество «готовых к запуску» процессов в этот момент, а avg указывает на структуру с 3 числами с фиксированной запятой (1,5,15 минут). cexp - это магические числа для уменьшения значений на 1,5 и 15 минут. Для справки это находится в /usr/src/sys/kern/kern_synch.c
... который я мог бы порекомендовать как увлекательное чтение.
Что касается FreeBSD, то больше всего людей удивляет в отзывчивых машинах с высокой средней нагрузкой то, что точечное пробуждение большого количества процессов может сильно завышать числа. IE: если 400-ish процессы все вместе просыпаются (иногда это делают веб-серверы или серверы баз данных).
/*
* Compute a tenex style load average of a quantity on
* 1, 5 and 15 minute intervals.
*/
static void
loadav(void *arg)
{
int i, nrun;
struct loadavg *avg;
nrun = sched_load();
avg = &averunnable;
for (i = 0; i < 3; i++)
avg->ldavg[i] = (cexp[i] * avg->ldavg[i] +
nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT;
/*
* Schedule the next update to occur after 5 seconds, but add a
* random variation to avoid synchronisation with processes that
* run at regular intervals.
*/
callout_reset_sbt(&loadav_callout,
SBT_1US * (4000000 + (int)(random() % 2000001)), SBT_1US,
loadav, NULL, C_DIRECT_EXEC | C_PREL(32));
}