Как избавиться от заголовков в команде ps в Mac OS X?

Я использую определенную команду ps, а именно

ps -p <pid> -o %cpu, %mem

который дает мне результат, подобный

 %CPU %MEM
 15.1 10.0

Все, что я хочу сделать, это просто напечатать эти цифры, такие как 15.1 и 10.0 без заголовков. Я попытался использовать "разрез". Но, похоже, это работает на каждой линии.

i.e

echo "$(ps -p 747 -o %cpu,%mem)" | cut -c 1-5

дает что-то вроде

 %CPU
  8.0

Как получить только цифры без заголовков?

Ответ 1

Использование awk:

ps -p 747 -o %cpu,%mem | awk 'NR>1'

Использование sed:

ps -p 747 -o %cpu,%mem | sed 1d

Ответ 2

BSD (и более общий POSIX) эквивалент GNU ps --no-headers немного раздражает, но с man-страницы:

 -o      Display information associated with the space or comma sepa-
         rated list of keywords specified.  Multiple keywords may also
         be given in the form of more than one -o option.  Keywords may
         be appended with an equals (`=') sign and a string.  This
         causes the printed header to use the specified string instead
         of the standard header.  If all keywords have empty header
         texts, no header line is written.

Итак:

ps -p 747 -o '%cpu=,%mem='

Что это.

Если вам когда-либо понадобится удалить первую строку из произвольной команды, хвост упростит:

ps -p 747 -o '%cpu,%mem' | tail +2

Или, если вы хотите быть полностью переносимым:

ps -p 747 -o '%cpu,%mem' | tail -n +2

Команда cut представляет собой эквивалент столбчатых эквивалентов более простых команд на основе строк head и tail. (Если вы действительно хотите вырезать столбцы, это работает... но в этом случае вы, вероятно, этого не делаете: гораздо проще передать параметры -o, которые вы хотите использовать в ps, в первую очередь, чем передавать дополнительные функции и пытаться вырезать их.)

Между тем, я не уверен, почему вы думаете, что вам нужно что-то сказать в качестве аргумента для эха, когда это имеет тот же эффект, что и управление им напрямую, и просто усложняет ситуацию. Например, следующие две строки эквивалентны:

echo "$(ps -p 747 -o %cpu,%mem)" | cut -c 1-5
ps -p 747 -o %cpu,%mem | cut -c 1-5

Ответ 3

Используйте ps --no-headers:

--no-headers print no header line at all

или используйте:

ps | tail -n +2

Ответ 4

Уже выбрал победителя. Drats...

Если вы уже используете параметр -o, вы можете указать заголовки для конкретных столбцов, которые вы хотите распечатать, поставив знак равенства после имени и имя столбца. Если вы поместите пустую строку, она не будет печатать заголовки:

Со стандартными заголовками (как и у вас):

$ ps -p $pid -o%cpu,%mem
 %CPU %MEM
  0.0  0.0

С пользовательскими заголовками (просто чтобы показать, как это работает):

$  ps -p $pid -o%cpu=FOO,%mem=BAR
  FOO  BAR
  0.0  0.0

С нулевыми заголовками (обратите внимание, что он даже не печатает пустую строку):

$ ps -p $pid -o%cpu="",%mem=""
 0.0   0.0