Как заставить команду ps показывать память в mb вместо kb?

11

Команда Linux ps показывает различное использование памяти, например, rss, размер в килобайтах по умолчанию. Есть ли способ показать в мб или гб как ls -s --human-readableделает?

Балки
источник
1
Отсутствие упоминания в man psпредполагает, что такой встроенной опции нет.
Ульрих Шварц

Ответы:

20

AFAIK, вы не можете добиться этого просто с помощью чистой psкоманды с опциями. Однако вы можете использовать некоторые текстовые процессоры, например, awkи заставить их делать то, что вы хотите:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'

Это берет результат из psи затем для каждой строки, кроме первой, которая заменяет 5-й столбец, который обычно находится в КБ, в МБ, добавляя суффикс М

Вы можете сделать его псевдонимом и сохранить его в файле .bashrc, чтобы вы могли вызывать его как-то так myps.

Большинство людей спрашивают, как сохранить формат или использовать другие единицы и точность.

Для простой версии вы можете использовать column -tвыходной фильтр:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t

Это, однако, не распознает пробелы в последнем столбце правильно. К сожалению, мы имеем дело с форматированием текста и готовим нашу собственную строку формата в printfподобном формате.

ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'

Объяснение:

  • NR==1условие только для первой строки (заголовок). Мы используем исходный вывод ps, чтобы определить, откуда начинается COMMAND:
    • o=$0 хранит неизмененную целую строку, чтобы мы могли использовать ее позже
    • a=match($0,$11) находит местоположение 11-го поля (должно быть там, где столбец COMMAND начинается в исходном выводе)
  • NR>1для следующих строк (данных). Мы меняем 5-е поле:
    • $5=int(10*$5/1024)/10"M" изменяет значение в мегабайтах с одним десятичным знаком и добавляет суффикс "M".
    • printf отображает все поля в виде столбца:
      • %-10sозначает sдля строки, 10для 10 символов в ширину, -для выравнивания по левому краю
      • %8sозначает sдля строки, 8для 8 символов в ширину, и из-за отсутствия -вывода этого поля выравнивается по правому краю.
    • substr(o, a)берет подстроку исходной строки (следовательно, oсохраненной ранее), начиная с позиции, aвычисленной в предыдущем условии, поэтому мы можем отобразить вывод команды с сохранением пробелов.
DevilaN
источник
3
Модифицировано для GB и с 2 десятичными 1.23GBps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
разрядами
1
Можно ли достичь той же цели, сохранив psформатирование? Снимки полностью удаленыawk
Крис
Я вижу, что вы работаете как int, возможно ли иметь десятичное значение, как 1.2M?
JavaSheriff
Почему отсутствуют вкладки?
Alex78191
@ Alex78191: Добавлена ​​альтернативная команда для форматирования с табличным выводом
DevilaN