Bash:编写一个脚本来检查数字差异,它是如何完成的?
我的任务是监视我公司的代理服务器。 我编写了一个命令,用于检查代理缓存同步状态并输出以下内容:Bash:编写一个脚本来检查数字差异,它是如何完成的?,bash,shell,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.
[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%差异指示。
您能帮助我吗?假设您自己的命令生成此标准输出:
[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 }'
或者,如果您想知道所有百分比:
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,然后与max进行比较,因此我们必须将一个awk操作馈送给第二个awk操作以找到max。即,通过backticks中的第一个awk函数获取max,并通过-v标志将变量“max”传递给第二个awk函数
{if($2>max)max=$2}END{print max}
:查找最大值的简单循环
{print$0,(max-$2)/max*100}
:计算与max的百分比差异,并打印原始行+追加百分比
if($2/最高)你可以用bc
来做这个计算。你可以说得更具体一点吗?谢谢。有没有可能假设最大的缓存文件是要比较的基准?很好,你能解释一下你做了什么吗?修复了脚本并添加了一些解释。我应该用不同的方式拼写这个问题,但你回答了谢谢。
[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