LinuxForum.Fans
Тема

PS. Сортировка с сохранением заголовка

Автор: SamuelLinux 15 сообщений 3441 просмотров
#172061

Здравствуйте.

Мне необходимо возвратить десять отсортированных в убывающем порядке процессов, наиболее требовательных к потреблению памяти, с применением утилиты ps.

Для этого я использую следующую команду:

[console]
$ ps -eo %mem | sort -gr | head -10
12.3
6.1
5.4
4.1
3.5
3.0
2.9
2.4
1.4
<...>
%MEM
[/console]
В данном случае, заголовок вывода, содержащий имя колонки (%МЕМ), будет включен в процесс сортировки и по её завершению окажется в конце отсортированного списка, а не в начале. Это является неприемлемым.

Как решить описанную проблему?

Спасибо.

#172067

SamuelLinux, а если подставить заголовок? :rolleyes:

text

~> echo '%MEM' && ps -eo %mem|sort -rg|head -10
%MEM
 1.1
 0.9
 0.8
 0.8
 0.8
 0.7
 0.7
 0.7
 0.6
 0.5
#172068

Нет, мне бы хотелось использовать «нативный» заголовок ps. Ваш вариант некорректно будет отображаться при выводе нескольких колонок.

[console]
$ echo 'Process CPU Memory' && ps -eo comm,%cpu,%mem | sort -gr -k3 | head -10
Process CPU Memory
firefox-bin 2.2 10.0
compiz 1.2 6.1
<...>
[/console]

Видите, в примере заголовки колонок CPU и Memory не выровнены с содержимым.

#172074

[console]
LIST=$(mktemp /tmp/list.XXXXXX)
ps -eo comm,%cpu,%mem > $LIST
head -n 1 $LIST
tail -n +2 $LIST | sort -gr -k3 | head -n 10
rm $LIST
[/console]

#172076

bormant, это наверно самый оптимальный вариант получается. В файл и вывод вытащить потом.

#172082

i2ks,
можно ещё дублироватьв 2 неименованных потока, из одного вытаскивать заголовок, другой сортировать...

#172108

bormant, спасибо за ответ.

Чтобы не перегружать вопрос излишними деталями, я вначале не указал, что требуемая команда будет использоваться внутри команды watch, и поэтому она должна быть компактна, чтобы не грузить систему при многократном повторении.

Вот пример использования:

[console]
$ watch -t -n1 'ps -eo comm,%cpu,%mem | sort -gr -k3 | head -10'
[/console]

Ваш вариант, к сожалению, не совсем подходит в данной ситуации.

#172144

К сожалению, "ps --sort -pmem" похоже не отрабатывает сортировку по %mem, а "ps --sort -sz" не сгодится в качестве критерия сортировки (с %mem не совпадает)?

"man ps" написал:
sz -- size in physical pages of the core image of the process. This includes text, data, and stack space. Device mappings are currently excluded; this is subject to change.
#172172

К слову, а чем не устраивает top, ведь именно его функциональность пытаетесь воспроизвести?

#172793
bormant написал:

К сожалению, "ps --sort -pmem" похоже не отрабатывает сортировку по %mem...

Да, так и есть.

bormant написал:

...а "ps --sort -sz" не сгодится в качестве критерия сортировки (с %mem не совпадает)?

Я, честно говоря, так и не понял, что определяет параметр sz. Как бы то ни было, c %mem он не совпадает.

bormant написал:

К слову, а чем не устраивает top, ведь именно его функциональность пытаетесь воспроизвести?

top мне показался громоздким и недостаточно гибким.

Нельзя, например, изменить порядок отображения столбцов в выводе, нельзя также указывать пользовательские имена для заголовков.

В top'е вся настройка осуществляется нажатием клавиш управления в течении сеанса работы с программой и последующим сохранением параметров по нажатию специальной клавиши. При этом создается малопонятный конфигурационный файл, сложный для ручной правки. Мне же удобней задавать параметры непосредственно при запуске команды с помощью ключей, а файл с настройками программы править вручную.

Возвращаясь к теме использования ps, замечу, что сортировка посредством утилиты sort работает некорректно. Вот пример. На рисунке видно, что выделенные данные отсортированы неправильно. Очевидно, что sort при сравнении числовых величин не учитывает десятичную часть и поэтому такие величины располагаются в списке в случайной последовательности.

#172801
SamuelLinux написал:
сортировка посредством утилиты sort работает некорректно

Какие ключи, такая и сортировка:
[console]$ echo -e "1.1\n1.2\n1.3"|sort -rn
1.3
1.2
1.1
[/console]

#172811

Из документации по использованию утилиты sort отличие ключей -n и -g мало понятно. У меня оба этих ключа осуществляют некорректную сортировку при использовании действительных чисел в столбцах. Пример с -g я дал выше. Вот пример с -n.

#172826

В сочетании с -k дробная часть, действительно, не попадает в ключ. По единственной колонке сортировка отрабатывает.

Возможно, устроит результат sort -k3 -rV

#172839
bormant написал:

Возможно, устроит результат sort -k3 -rV

Эта команда, к сожалению, не будет корректно работать в том случае, если одна из предыдущих выведенных колонок будет содержать текстовые данные. Вот пример.

На рисунке видно, что в первом случае, где выведены данные о загрузке процессора и количестве затраченной памяти, sort отработал успешно. Во втором же случае, утилита дала сбой в силу того, что в первой колонке были выведены строчные данные.

#172890

[console]
$ echo -e "sh\t0.0\nsh\t0.0\nXorg\t7.2\nruby\t0.3\nbash\t0.3" | sort -k2 -rV
Xorg 7.2
ruby 0.3
bash 0.3
sh 0.0
sh 0.0

$ sort --version
sort (GNU coreutils) 8.11
Copyright (C) 2011 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <http://gnu.org/licenses/gpl.html>
Это свободное ПО: вы можете продавать и распространять его.
Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.

Авторы программы -- Mike Haertel и Paul Eggert.

$ cat /etc/*-version
Slackware 13.37.0
[/console]У меня это выглядит несколько иначе.

Войдите или зарегистрируйтесь, чтобы ответить.