我正在使用以下内容输出上传速度测试的结果
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 %s\n ", $0); }}'
但是,如果我删除
,它不会输出任何内容&& ($2 == "M/s"))
它可以工作,但我显然希望它输出高于5M / s,因为如果它超过1K / s它仍然会快速回声。有人能告诉我我错过了什么。
答案 0 :(得分:2)
使用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
?
答案 1 :(得分:1)
根据@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 $1\n";
} else {
print "FAIL $1\n";
}
}
}
然后调用它
wput 10MB.zip ftp://user:pass@host 2>&1 | perl script.pl
答案 2 :(得分:0)
这是更新问题的答案。
使用awk
程序,您尚未将速度分为数值和单位值。它只是一个字符串。
由于速度快于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 %s\n ", $0); }}'