我的任务是监视我公司的代理服务器。我编写了一个命令,它检查代理缓存同步状态并输出如下:
[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%的diff指示。你能帮帮我吗?
发布于 2014-09-28 11:59:05
假设您自己的命令生成了这个stdout:
[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 }'我冒昧地更改了最后一个缓存号,以给出一个指示性<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:这个位将您的自定义命令的stdout传输到awk
awk -F,:将输入分隔符声明为逗号
-v max=...:由于我们需要迭代两次输出,才能首先得到最大值,然后与max进行比较,所以我们必须为第二个awk操作提供一个awk操作,以找到max。即,通过后背的第一个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%。如果没有,打印“违规”行。
https://stackoverflow.com/questions/26084482
复制相似问题