Bash:写一个会检查数字差异的脚本,怎么做?

时间:2014-09-28 11:38:16

标签: bash shell

我被赋予了监控公司代理服务器的任务。 我编写了一个命令来检查代理缓存同步状态并输出:

[root@bmark1 ~]# check ny4a
 #===# NY4A: #===#
      7 36079435
      3 36079441
Would you like to view specific list? [y/n] y
     [java] ny4aproxy5.company.com,36079435
     [java] ny4aproxy4.company.com,36079435
     [java] ny4aproxy12.company.com,36079441
     [java] ny4aproxy11.company.com,36079435
     [java] ny4aproxy3.company.com,36079435
     [java] ny4aproxy2.company.com,36079435
     [java] ny4aproxy1.company.com,36079435
     [java] ny4aproxy10.company.com,36079435
     [java] ny4aproxy9.company.com,36079441
     [java] ny4aproxy13.company.com,36079441
 #===# The check is based on file: /workspace/repository/proxyui/proxy_list.csv  #===#
[root@bmark1 ~]#

check命令返回每个服务器上缓存文件的大小。

最佳做法是使所有文件具有相同的大小或具有少量增量。 在某些方面,一些代理服务器不同步,其缓存文件大小被卡住而没有更新。

因此,您可以在我的命令输出中看到有7个服务器的缓存文件大小为:36079435字节,还有3个服务器不同步,缓存文件大小为36079435。 我想写一个脚本/检查,它会发现任何服务器的缓存文件大小是否大于10%。

我知道如何解析缓存文件大小,但不知道如何编写脚本并获得10%差异指示。 你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

假设您自己的命令生成此标准输出:

 [java] ny4aproxy5.company.com,36079435
 [java] ny4aproxy4.company.com,36079435
 [java] ny4aproxy12.company.com,36079441
 [java] ny4aproxy11.company.com,36079435
 [java] ny4aproxy3.company.com,36079435
 [java] ny4aproxy2.company.com,36079435
 [java] ny4aproxy1.company.com,36079435
 [java] ny4aproxy10.company.com,36079435
 [java] ny4aproxy9.company.com,36079441
 [java] ny4aproxy13.company.com,30079441

以下命令仅返回阈值以下的缓存:

yourcommand | awk -F, -v max=`yourcommand | awk -F, 'OFS=","{if ($2>max) max=$2}END {print max}'` '{if (($2/max)<0.9) print "outside threshold: " $0 }'

我冒昧地改变了最后一个缓存编号,给出了一个指示性的&lt; 90%的例子。输出:

outside threshold:  [java] ny4aproxy13.company.com,30079441

或者如果您想知道所有百分比:

yourcommand | awk -F, -v max=`yourcommand | awk -F, 'OFS=","{if ($2>max) max=$2}END {print max}'` '{print $0, (max-$2)/max*100 }'

输出:

 [java] ny4aproxy5.company.com,36079435 1.663e-05
 [java] ny4aproxy4.company.com,36079435 1.663e-05
 [java] ny4aproxy12.company.com,36079441 0
 [java] ny4aproxy11.company.com,36079435 1.663e-05
 [java] ny4aproxy3.company.com,36079435 1.663e-05
 [java] ny4aproxy2.company.com,36079435 1.663e-05
 [java] ny4aproxy1.company.com,36079435 1.663e-05
 [java] ny4aproxy10.company.com,36079435 1.663e-05
 [java] ny4aproxy9.company.com,36079441 0
 [java] ny4aproxy13.company.com,30079441 16.63

<强>解释

yourcommand | awk:这个位将自定义命令的标准输出管道输出到awk

awk -F,:将输入分隔符声明为逗号

-v max=...:因为我们需要迭代输出两次以获得最大值然后与max进行比较,我们必须提供awk操作以找到第二次awk操作的最大值。即通过反引号中的第一个awk函数获取最大值,并通过-v标志将变量'max'传递给第二个awk函数。

{if ($2>max) max=$2}END {print max}:查找最大值的简单循环

{print $0, (max-$2)/max*100 }:计算与最大值和打印原始行+附加百分比

的百分比差异

if (($2/max)<0.9) print "outside than threshold: " $0:进行简单检查,看看缓存大小的比例是否至少为最大值的90%。如果没有,请打印'违规'行