Как правильно сохранить вывод команды unix top в переменную? - PullRequest
4 голосов
/ 26 января 2010

Я должен сохранить вывод команды top в переменную, и я делаю это:

myvar=`top -b -n1 | head -n 18`

Проблема в том, что он, кажется, игнорирует возвращаемые символы, поэтому, когда я отображаю содержимое $myvar, я вижу что-то вроде:

top - 15:15:38 up 745 days, 15:08, 5 users, load average: 0.22, 0.27, 0.32 Tasks: 133 total, 1 running, 132 sleeping, 0 stopped, 0 zombie Cpu(s): 6.4% us, 1.6%sy, 0.0% ni, 91.7% id, 0.3% wa, 0.0% hi, 0.0% si Mem: 2074716k total, 2038716k used, 36000k free, 84668k buffers Swap: 4192924k total, 107268k used, 4085656k etc...

Как правильно сохранить все топ-данные?

Ответы [ 3 ]

16 голосов
/ 26 января 2010

Обратите внимание на разницу:

#! /bin/bash

x=`top -b -n 1 | head -n 5`
echo $x
echo --------------------
echo "$x"

Выход:

top - 14:33:09 up 7 days, 5:58, 4 users, load average: 0.00, 0.00, 0.09 Tasks: 253 total, 2 running, 251 sleeping, 0 stopped, 0 zombie Cpu(s): 1.6%us, 0.4%sy, 70.3%ni, 27.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 3926784k total, 3644624k used, 282160k free, 232696k buffers Swap: 9936160k total, 101156k used, 9835004k free, 1287352k cached
--------------------
top - 14:33:09 up 7 days,  5:58,  4 users,  load average: 0.00, 0.00, 0.09
Tasks: 253 total,   2 running, 251 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.6%us,  0.4%sy, 70.3%ni, 27.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3926784k total,  3644624k used,   282160k free,   232696k buffers
Swap:  9936160k total,   101156k used,  9835004k free,  1287352k cached

Без кавычек содержимое переменной измельчается при обработке аргументов оболочки.

1 голос
/ 26 января 2010

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

0 голосов
/ 26 января 2010

Вы могли бы передать это через sed, чтобы поймать и преобразовать разрывы строк, например

top -n1 | sed 's/\(.*\)$/\1__CUSTOM_LINE_MARKER/g'

будет выводить CUSTOM_LINE_MARKER после каждой строки. хотя ответ Роба Уэллса, вероятно, является лучшим подходом.

...