Чтобы отсортировать по столбцу 8 (столбец "очередь" ), учитывая только числовую часть и предполагая, что начальный текст всегда " comp.q@bam
" (10 символов ), и есть только один пробел перед этим полем, и для численной сортировки вы можете использовать:
qstat | head -n 2
qstat | sed 1,2d | sort -k8.12,8.14n
Два отдельных вызова qstat
должны сначала распечатать две строки заголовка (, чтобы они не сортировались с данными ),затем отсортировать фактические данные (, удалив эти первые две строки заголовка ). Сортировка "вводится"(-k
)в поле 8, начиная с позиции 12 и заканчивая позицией 14, с помощью числовой сортировки n
. Определение ключа здесь считает начальный пробел перед полем «queue» как позицию #1, поэтому фактические числа (в вашем образце )начинаются с позиции 12. Если ваш вывод может иметь более длинные числовые поля, отрегулируйте конечный диапазон(8.14
)вверх.
Если бы вы хотели сохранить это как нечто повторно используемое, вы могли бы создать функцию:
function sortqstat() {
qstat | head -n 2
qstat | sed 1,2d | sort -k8.12,8.14n
}
Поскольку числовая часть кажется заполненной нулями -, вы можете попробовать более простой вариант --просто скажите sort
просто отсортировать поле 8 в общем виде:
qstat | sort -k8,8
Эта упрощенная сортировка перемещает заголовки; чтобы разделить их, используйте отдельные вызовы, как указано выше. В этом упрощении повторяющиеся имена очередей будут сортироваться вместе, затем численно внутри них --, а не все строго численно, если есть разные имена очередей.
glenn jackman прокомментировал с улучшением --способ разбора вывода только одним вызовом qstat
; Я немного изменил их идею на эту:
qstat | { IFS= read -r header1;
IFS= read -r header2;
printf "%s\n" "$header1" "$header2";
sort -k8,8; }
Это открывает канал от qstat к группе команд (, заключенной в фигурные скобки{}
); эта группа команд считывает первые две строки в переменные header1 и header2, а затем печатает эти строки заголовка. Поскольку этих строк больше нет во входных данных, следующей команде sort
остается только отсортировать данные. Я нашел более очевидным явное чтение двух строк заголовка, но вы можете выполнить простое «чтение и печать» дважды или с помощью цикла.