Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:编写一个脚本来检查数字差异,它是如何完成的?_Bash_Shell - Fatal编程技术网

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