Bash: извлечение данных из программы командной строки

Я знаю, как получить общую память в системе:

$ free -lm
             total       used       free     shared    
Mem:          3008       2495        513         57

Я знаю, как получить потребление основной памяти (RSS) рабочими процессами в Nginx:

$ ps -C nginx -O rss
  PID   RSS S TTY          TIME COMMAND
 1564  1336 S ?        00:00:00 nginx: master process /usr/sbin/nginx
 1565  1756 S ?        00:00:00 nginx: worker process
 1566  1756 S ?        00:00:00 nginx: worker process
 1567  1756 S ?        00:00:00 nginx: worker process
 1568  1756 S ?        00:00:00 nginx: worker process

Теперь определим, сколько рабочих процессов моя система могла бы использовать, не прибегая к свопу:

echo $((3008 * 1024))
3080192
$ echo $((3080192 / 1756))
1754

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

Моя проблема в том, что я не знаю, как извлечь это «3008» из бесплатной команды из командной строки. Как мне с этим справиться?

0
08.10.2016, 19:51
4 ответа

Вы можете сделать это с помощью head, tail и cut:

free -lm | head -2 | tail -1 | tr -s ' ' | cut -f2 -d' '

head -2 , потому что это две верхние строки .

             total       used       free     shared    buffers     cached
Mem:          3757       1765       1991        138        122        766

tail -1 , потому что это последняя строка.

Mem:          3757       1765       1991        138        122        766

tr -s '' - преобразует цепочки пробелов в один пробел.

Mem: 3757 1765 1991 138 122 766

Наконец - cut -f2 -d '' - получение второго поля, разделенного пробелами.

3757
0
28.01.2020, 02:34

Свободный конвейер для awk извлечет нужное вам значение:

free -l | awk '/ ^ Mem / {print $ 2}'

1
28.01.2020, 02:34

Моя проблема в том, что я не знаю, как извлечь это «3008» из бесплатной команды из командной строки

Учитывая этот вывод:

free -lm
             total       used       free     shared    buffers     cached
Mem:          3757       1765       1991        138        122        766
Low:          3757       1765       1991
High:            0          0          0
-/+ buffers/cache:        876       2880
Swap:         7772          0       7772


Попробуйте следующее:

free -lm | grep '^Mem' | awk '{ print $2 }'
3757

Что вернет столбец total в строке Mem: . В моем случае 3757 .

1
28.01.2020, 02:34

Примерно так:

echo $ (($ (($ (free -lm | grep Mem | awk '{print $ 2}') * 1024 )) / $ (ps -C nginx -O rss | grep 'nginx: рабочий процесс $' | awk '{print $ 2}' | tail -1)))

0
28.01.2020, 02:34

Теги

Похожие вопросы