如何在ps命令输出bash脚本中计算rss和vsz之间的关系?

时间:2017-11-28 12:01:29

标签: linux bash shell scripting

ps axo time,vsz,rss,pid,command --no-header | tr -s ' ''_' | sort显示此输出:

00:00:00 0 0 1021 [nfsiod]
00:00:00 0 0 1052 [lockd]

我想在新列中计算和打印ps输出,rss(实内存使用)和vsz(整个过程的虚拟内存使用)之间的关系, ,我做了:

for i in   $(ps axo time,vsz,rss,pid,command  --no-header | tr -s ' ''_' | sort)
        do
              var1=$(echo $i | cut -d" " -f2)
              var2=$(echo $i | cut -d" " -f3)
              result=$(echo "$var2 / $var1"  | bc -l)

              echo $i $result
        done

但是,我得到了一些我不理解的错误,例如:

(standard_in) 1: illegal character: :
(standard_in) 1: syntax error
(standard_in) 1: illegal character: :
00:00:00
Runtime error (func=(main), adr=3): Divide by zero
0

可能指的是这些行

                  var1=$(echo $i | cut -d" " -f2)
                  var2=$(echo $i | cut -d" " -f3)
                  result=$(echo "$var2 / $var1"  | bc -l)

感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

早上好,这与您对for循环的使用有关。用于分隔由空格分隔的每个单词。对于在线上循环,更好地使用,如下所示:

#!/bin/bash

ps axo time,vsz,rss,pid,command  --no-header | tr -s ' ''_' | sort | while read line
do
    echo $line
    var1=$(echo $line | cut -d" " -f2)
    var2=$(echo $line | cut -d" " -f3)
    if [ $var1 -ne 0 ]
    then
        result=$(echo "$var2 / $var1"  | bc -l)
    else
        result="N/A"
    fi

    echo $line $result
done

我还为$ var1 == 0添加了验证。除以0始终是个问题!

答案 1 :(得分:0)

AWK表达式的简短解决方案:

ps axo time,vsz,rss,pid,command --no-headers --sort=time | awk '{ $(NF+1)=($2==0? 0 : $3/$2) }1'
  • $(NF+1) - 指向最后一个添加的字段