Как прочитать ввод из стандартного вывода другой команды (трубы) в сценарии оболочки Linux? - PullRequest
3 голосов
/ 02 сентября 2010

Моя цель - найти процесс, который потребляет больше всего ресурсов процессора и оперативной памяти. написав сценарий. Однако мне удалось извлечь информацию из команды TOP, но у меня возникли проблемы с анализом вывода.

Следующая команда,

top -b -n 1 | tail -n +8 | head -n 1

Выводит что-то похожее на эту строку

915 root      20   0  209m  74m 8644 S    8  7.7   5:27.57 Xorg

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

echo " Parameter is ${2} ${3}"

Ответы [ 5 ]

2 голосов
/ 03 сентября 2010

Просто для удовольствия:)

top -b -n1 | head -8 | tail -2 | awk '
{
    if (NR==1) {
        print "\nHey teacher, leave those kids alone! - Pink Floyd ;)\n";
        print $2,$1,$9,$10;
        next;
    }
    print $2,$1,$9,$10;
}'

Или, если вам нужен другой формат отчета:

top -b -n1 | head -8 | tail -1 | awk '{ printf "User: %s\nPID: %s\nCPU Usage: %s\nMEM Usage: %s\n", $2,$1,$9,$10 }'
2 голосов
/ 03 сентября 2010

Используйте set --, чтобы аргументы стали позиционными параметрами.

set -- $(top -b -n 1 | tail -n +8 | head -n 1)
echo " Parameter is ${2} ${3}"
1 голос
/ 13 сентября 2010

Учитывая

# 915 root      20   0  209m  74m 8644 S    8  7.7   5:27.57 Xorg  

, вы можете прочитать все это прямо в переменные со средним именем:

top -b -n 1 | tail -n +8 | head -n 1 |
    read XPID XUSERID XPRIORITY XVIRTUAL XRESIDENT XSHARED XSTATE XCPU XMEM XTIME XCOMMAND

(единственная проблема заключается в том, что значения становятся настолько большими, что столбцы касаются друг друга... в этом случае вам нужно использовать что-то вроде вырезания с жестко закодированными номерами столбцов, а не полагаться на разделение пробелов)

1 голос
/ 02 сентября 2010

Получить строку в переменную:

OUTPUT=`top -b -n 1 | tail -n +8 | head -n 1`

Преобразовать в массив:

LIST=($OUTPUT)

И выведите поля:

echo ${LIST[1]}
echo ${LIST[2]}
1 голос
/ 02 сентября 2010

сохранить строку вывода, сжав все пробельные символы:

LINE=$(top -b -n 1 | tail -n +8 | head -n 1 | tr -s ' ')

, а затем используйте cut, чтобы получить нужную часть:

echo " Parameter is $(echo $LINE | cut -d' ' -f2) $(echo $LINE | cut -d' ' -f3)"

и т. Д.

не самый элегантный способ, но самый быстрый, который я могу придумать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...