Bash:从命令行程序中提取数据

Bash:从命令行程序中提取数据

我知道如何获取系统中的总内存:

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

我知道如何获取 Nginx 中工作进程的主要内存消耗(RSS):

$ 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 工作线程,而无需求助于交换。但是,如果我可以将上面的这个多步骤过程变成可以从命令行执行的单行,那就太好了。

我的问题是我不知道如何从命令行的 free 命令中提取“3008”。我该如何解决这个问题?

答案1

我的问题是我不知道如何从命令行的 free 命令中提取“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

答案2

通过管道免费传输到 awk 将提取您需要的值:

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

答案3

就像是:

echo $(($(($(free -lm | grep Mem | awk '{print $2}') * 1024)) / $(ps -C nginx -O rss |grep 'nginx: 工作进程$' | awk ' {打印 $2}' | 尾部 -1)))

答案4

你应该能够用头部、尾部和切口来做到这一点:

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

相关内容