首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:编写一个将检查数值差异的脚本,它是如何完成的?

Bash:编写一个将检查数值差异的脚本,它是如何完成的?
EN

Stack Overflow用户
提问于 2014-09-28 11:38:15
回答 1查看 41关注 0票数 0

我的任务是监视我公司的代理服务器。我编写了一个命令,它检查代理缓存同步状态并输出如下:

代码语言:javascript
复制
[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指示。你能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-28 11:59:05

假设您自己的命令生成了这个stdout:

代码语言:javascript
复制
 [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

以下命令只返回低于阈值的缓存:

代码语言:javascript
复制
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%的示例。输出:

代码语言:javascript
复制
outside threshold:  [java] ny4aproxy13.company.com,30079441

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

代码语言:javascript
复制
yourcommand | awk -F, -v max=`yourcommand | awk -F, 'OFS=","{if ($2>max) max=$2}END {print max}'` '{print $0, (max-$2)/max*100 }'

输出:

代码语言:javascript
复制
 [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%。如果没有,打印“违规”行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26084482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档