【问题标题】:How to write a shell script to find min max and average from sar reports for ram utilization如何编写 shell 脚本以从 sar 报告中查找 ram 利用率的最小最大值和平均值
【发布时间】:2017-11-03 13:24:12
【问题描述】:

我编写了一个 shell 脚本来从 sar 报告中为命令 sar -r -f 查找平均值、最小值和最大值,如下所示

MIN1=`sar -r -f |awk '{print $5}'|grep -v '%memused'|awk 'min=="" || $0 < min {min=$0} END{ print min}'`

MAX1=`sar -r -f |awk '{print $5}'|grep -v '%memused'|grep -v '_x86_64_'|grep -v '86327'|awk 'min=="" || $0 > min {min=$0} END{ print min}'`

AVG1=`sar -r -f |awk '{print $5}'|grep -v '%memused'|grep -v '_x86_64_'|grep -v '86327'|awk '{total+=$0} END {print total/NR}'`

echo Minimum value is $MIN1 : average value is $AVG1 : maximum value is $MAX1

sar -r -f 命令 o/p:

Linux 2.6.32-431.el6.x86_64 (servername)   11/03/2017      _x86_64_        (4 CPU)

12:00:01 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit

Average:       315191  32697953     99.05     86327  16937751  25889218     53.25

脚本输出:

Minimum value is 95.50 : average value is 868.053 : maximum value is 86327

预期输出:

Minimum value is 95 : average value is 96 : maximum value is 97

我已使用出现在最后一列中的grep -v 86327 跳过了该值,但因为它每次输出都会发生变化。

【问题讨论】:

  • 请更清楚地使用代码标签以便更好地理解。

标签: linux bash shell awk


【解决方案1】:

关注awk 可能对您有所帮助。

sar -r -f |  awk '
FNR>1&&!/memused/{
 max=max>$5?max:$5;
 min=min>$5?$5:(min?min:$5);
 sum+=$5}
END{
print "Minimum:",min,"Average:",(sum/FNR),"Maximum:",max
}'

编辑:现在也为代码添加解释。

sar -r -f |  awk '      ## Sending sar standard output as a standard input by pipe to awk command.
FNR>1&&!/memused/{      ## checking if line number is greater than and not having string memused in it then do following.
 max=max>$5?max:$5;     ## creating a variable named max and checking if max variable value is greater than 5th field then keep it as max else keep it as 5th field to get the maximum values.
 min=min>$5?$5:(min?min:$5); ##creating a variable named min and checking if min value is greater than 5th field if yes then change its value to $5 or check if min is there keep its value to min or if min is NULL then keep it as $5 value.
 sum+=$5}               ## creating variable named sum and adding its value to itself along with 5th fields value.
END{
print "Minimum:",min,"Average:",(sum/FNR),"Maximum:",max ##Printing string minimum and min value similarly with avg and maximum too.
}'

【讨论】:

  • 它显示 o/p 为平均值:812.191 最小值:95.50 最大值:84547 作为 sar 报告的最后一列,显示 o/p 为平均值:313984 32699160 99.05 84547 16949896 25856886 53.19 我想跳过 84547 这个值以获得正确的 o/p,因为它每次都会变化 @RavinderSingh13
  • @ashish,对不起,我没听明白,你能详细解释一下这里不正确的地方吗?
  • 参考我的问题中提到的 sar o/p,它指的是 kbbuffers 列中的最后一个值,即 84547,每次都会变化,所以 o/p 出错了@RavinderSingh13
  • @ashish, ,我的命令都在 sar 命令上运行,它不是基于你的命令构建的,当我在我的系统上检查它时,它给出了准确的输出,不确定你是否运行它在你的系统上?
  • 我对你的命令做了一些修改,现在它工作正常感谢@RavinderSingh13的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2020-05-16
  • 2015-01-16
  • 1970-01-01
相关资源
最近更新 更多