С timeout
из GNU Coreutils:
while : ; do
timeout 20h yourcommand
sleep 5
done
Учитывая данные вашего вопроса в файле с именемfile
:
$ awk '{ print $2 }' <file | sort | uniq -c | sort -rn | head -n 20
23 36141
9 36280
В приведенных данных есть только два уникальных числа во втором поле (36141 встречается 23 раза, а 36280 встречается 9 раз ).
Конвейер извлекает второй столбец, используяawk
(вместо этого используйте cut -f 2
, если данные разделены табуляцией -). Затем этот список чисел сортируется и uniq -c
подсчитывает, сколько раз встречается каждое число. sort -rn
сортирует их по количеству в порядке от большего к меньшему, а последний head -n 20
сокращает список до 20 уникальных номеров (только два числа уникальны в данных примера ).
awk '
FNR==NR && NR<=20{ a[$2]; b[++cnt]=$2; next }
$2 in a{
if ($2 in c) c[$2]=c[$2] ORS $0 # append line to existing line(s)
else c[$2]=$0 # add first line
}
END{ for (i=1; i<=cnt; i++) print c[b[i]] }
' <(awk '{ print $2 }' file | sort | uniq -c | sort -rn) file
Замена процесса
awk
:напечатать второе поле sort
:в этом примере не требуется, так как идентификаторы PID уже являются соседними, не уверен, что это всегда так uniq
:распечатать уникальный счетчик и PID sort
:обратный числовой (сначала самый высокий счет)Основной сценарий
Использовать результат подстановки процесса (, ограниченный 20 строками, игнорировать счетчик )и исходный файл в качестве входных данных. Сохраните PID в двух массивах a
и b
, затем обработайте входной файл и сохраните нужные строки в массиве c
и распечатайте их.
a
:идентификаторы PID в качестве индексов, используемых для поиска b
:индекс для отображения PID для поддержания порядка на выходе c
:хранит строки для печати (PID как индекс)