将速度结果设置为通过或失败



我使用下面的代码输出一个上传速度测试的结果

wput 10MB.zip ftp://user:pass@host 2>&1 | grep '([0-9.]+[KM]/s)'

返回

18:14:38 (10MB.zip) - '10.49M/s' [10485760]
Transfered 10,485,760 bytes in 1 file at 10.23M/s

我想有结果10.23M/s(即速度)呼应,和比较结果:

if speed=>5 MB/s then echo "pass" else echo "fail"

那么,最终输出将是:

PASS 7 M/s 

23/01/2013

理想情况下,我希望所有这些都在一行上完成到目前为止,我有

wput 100M.bin ftp://test:test@0.0.0.0 2>&1 | grep -o '([0-9.]+[KM]/s)$' | awk ' { if (($1 > 5) && ($2 == "M/s")) { printf("FAST %sn ", $0); }}'
但是如果我删除 它不会输出任何东西
&& ($2 == "M/s"))

它可以工作,但我显然希望它的输出高于5M/s,因为它仍然会快速回声,如果它超过1K/s。谁能告诉我我错过了什么?

使用awk:

# Over 5M/s
$ cat pass
18:14:38 (10MB.zip) - '10.49M/s' [10485760]
Transfered 10,485,760 bytes in 1 file at 10.23M/s
$ awk 'END{f="FAIL "$NF;p="PASS "$NF;if($NF~/K/s/){print f;exit};gsub(/M/s/,"");print(int($NF)>5?p:f)}' pass
PASS 10.23M/s
# Under 5M/s
$ cat fail
18:14:38 (10MB.zip) - '3.49M/s' [10485760]
Transfered 10,485,760 bytes in 1 file at 3.23M/s 
$ awk 'END{f="FAIL "$NF;p="PASS "$NF;if($NF~/K/s/){print f;exit};gsub(/M/s/,"");print(int($NF)>5?p:f)}' fail
FAIL 3.23M/s
# Also Handle K/s 
$ cat slow
18:14:38 (10MB.zip) - '3.49M/s' [10485760]
Transfered 10,485,760 bytes in 1 file at 8.23K/s
$ awk 'END{f="FAIL "$NF;p="PASS "$NF;if($NF~/K/s/){print f;exit};gsub(/M/s/,"");print(int($NF)>5?p:f)}' slow
FAIL 8.23K/s

不知道你从哪里得到7 M/s ?

根据@Rubens,您可以使用grep -o与您的正则表达式来显示速度,只需附加$作为行尾

wput 10MB.zip ftp://user:pass@host 2>&1 | grep -o '([0-9.]+[KM]/s)$'

使用perl,你可以很容易地做剩下的东西

use strict;
use warnings;
while (<>) {
    if (m!s+((d+.d+)([KM])/s)$!) {
        if ($2 > 5 && $3 eq 'M') {
            print "PASS $1n";
        } else {
            print "FAIL $1n";
        }
    }
}

然后命名为

wput 10MB.zip ftp://user:pass@host 2>&1 | perl script.pl

这是对问题更新的回答。

awk程序中,您没有将速度拆分为数值和单位值。它只是一个字符串。

因为fast speed大于5 M/s,所以可以忽略K/s,并通过在字符M处分割提取速度。然后你可以在$1中比较速度

wput 100M.bin ftp://test:test@0.0.0.0 2>&1 | grep -o '[0-9.]+M/s$' | awk -F '/M/' '{ if ($1 > 5) { printf("FAST %sn ", $0); }}'

最新更新