Сортировка вывода bash по числу, извлеченному из определенного столбца

ps $(ip netns pids myns)где myns— ваше пространство имен

0
23.07.2020, 22:53
1 ответ

Чтобы отсортировать по столбцу 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остается только отсортировать данные. Я нашел более очевидным явное чтение двух строк заголовка, но вы можете выполнить простое «чтение и печать» дважды или с помощью цикла.

4
18.03.2021, 23:17

Теги

Похожие вопросы