Первое, что нужно сделать, это удалить ненужные строки из вывода showq -r
, i. e. строки, которые говорят об активных заданиях и т.д. ..что можно сделать с помощью showq -r | sed '1,2d' |sed '$d'
, или можно использовать grep
с регулярным выражением, которое описывает часть строки данных - e. g. grep "----"
в этом случае может сработать, если значение EFFIC
всегда ----
. Как только у вас есть файл, содержащий только строки данных, вы используете ассоциативные массивы в awk
для выполнения остальной магии.
#!/bin/awk
{
proc_count[$7] = proc_count[$7] + $10;
if ($10 > 1) { multi_proc[$7]++; } else { single_proc[$7]++; }
}
END {
for (foo in proc_count) { print foo, proc_count[foo], multi_proc[foo], single_proc[foo] }
}
Если вы запустите вышеприведенный скрипт, вы заметите, что для user_z
ничего не отображается при подсчете последовательного процессора. Это потому, что я пытался сохранить строки и не напечатал там 0
. Я оставлю это на ваше усмотрение, чтобы вы добавили проверку на ошибку и притворились, что выводится.
Сначала сохраните следующий скрипт и chmod +x
к нему. Допустим, назовём его job_processor.awk
:
#!/usr/bin/gawk -f
## $7 username
## $8 groupname
## $10 procs
{
if ( $10 == 1 )
printf ("username: %s and groupname: %s are serial!\n",$7,$8);
else if ( $10 > 1 )
printf ("username: %s and groupname: %s are parallel!\n",$7,$8);
printf ("username: %s and groupname: %s with procs: %d!\n",$7,$8,$10);
}
нужно использовать следующий формат:
cat jobs |./job_process.awk |sed '1,2d' |sed '$d'
Вывод:
username: user_X and groupname: group_A are parallel!
username: user_X and groupname: group_A with procs: 8!
username: user_Y and groupname: group_B are parallel!
username: user_Y and groupname: group_B with procs: 16!
username: user_Y and groupname: group_B are serial!
username: user_Y and groupname: group_B with procs: 1!
username: user_X and groupname: group_A are serial!
username: user_X and groupname: group_A with procs: 1!
username: user_X and groupname: group_A are parallel!
username: user_X and groupname: group_A with procs: 2!
username: user_Z and groupname: group_A are parallel!
username: user_Z and groupname: group_A with procs: 4!