我正在运行一个shell脚本,对我的服务执行负载测试。在测试结束时,我得到一个如下所示的文件:
200 2.691
200 2.735
404 1.997
404 2.838
200 1.394
200 1.833
我想计算每个唯一HTTP响应代码的最小,最大和平均响应时间。像这样的东西 -
http min max mean count
200 1.394 2.735 2.163 4
404 1.997 2.838 2.418 2
输出源自此命令(如果有帮助):
curl -s -o /dev/null -w "%{http_code}\t%{time_total}\n" $SERVICE_URL
有人可以分享关于我如何在bash中实现这一目标的指针吗?我查看http://cacodaemon.de/index.php?id=11的想法,但无法做任何事情。
感谢。
答案 0 :(得分:3)
$ cat tst.awk
{
min[$1] = ( ($1 in min) && (min[$1] < $2) ? min[$1] : $2 )
max[$1] = ( ($1 in max) && (max[$1] > $2) ? max[$1] : $2 )
sum[$1] += $2
cnt[$1]++
}
END {
print "http", "min", "max", "mean", "cnt"
for (key in cnt) {
print key, min[key], max[key], sprintf("%.3f",sum[key]/cnt[key]), cnt[key]
}
}
$ awk -f tst.awk file | column -t
http min max mean cnt
200 1.394 2.735 2.163 4
404 1.997 2.838 2.417 2
以上内容适用于任何UNIX机器上任何shell中的任何awk。
答案 1 :(得分:1)
按空白-W
分组按列1 -g 1
进行分段,根据分组打印第2列的输出:
datamash -sW -g 1 min 2 max 2 mean 2 count 2 <dmInput
要了解更多内容:
datamash --header-out -sW -g 1 min 2 max 2 mean 2 count 2 <dmInput | column -t
并且......如果您真的想使用awk
,可以使用它来添加列名称:
awk 'BEGIN {print "HttpCode ResponseTime";} {print}' dmInput | datamash -sWH -g HttpCode min ResponseTime max ResponseTime mean ResponseTime count ResponseTime | column -t
答案 2 :(得分:0)
这是基线perl(没有CPAN允许,因为只是在那时使用我的datamash答案)等同于Ed的答案。如上所述,在各方面都只是一点点肮脏:
£ cat tst.pl
$min{$F[0]} = $F[1] if !(exists $min{$F[0]}) || $F[1] < $min{$F[0]};
$max{$F[0]} = $F[1] if !(exists $max{$F[0]}) || $F[1] > $max{$F[0]};
$sum{$F[0]} += $F[1];
$cnt{$F[0]}++;
END
{
print "http min max mean cnt";
for $key (keys %cnt)
{print "$key $min{$key} $max{$key} @{[$sum{$key}/$cnt{$key}]} $cnt{$key}";}
}
£ perl -lan tst.pl dmInput | column -t
http min max mean cnt
404 1.997 2.838 2.4175 2
200 1.394 2.735 2.16325 4
答案 3 :(得分:-1)
使用awk数组
cat 1.txt | nawk '{s[$1]+=$2;c[$1]++;max[$1]=max[$1]>$2?max[$1]:$2;min[$1]=min[$1]==0?$2:min[$1]>=$2?$2:min[$1]} END{for(i in s) print i","min[i]","max[i]","s[i]/c[i]","c[i]}' | sort
200,1.394,2.735,2.16325,4
404,1.997,2.838,2.4175,2