【发布时间】:2014-11-20 07:16:47
【问题描述】:
我正在使用成功标志 S 执行grep。$11 是服务类型,$12 是 S(成功)或 F(失败),$14 是经过的时间。下面的命令我得到平均经过的时间。
bash-3.2$ grep 'EXSTAT|' ivrbroker.log | grep '|F|' |
> /usr/xpg4/bin/awk -F"|" '{a[$11]++;c[$11]+=$14}
> END{for(b in a){print b"," a[b]","c[b]/a[b]}}'
QCPE,2,276.5
bash-3.2$ grep 'EXSTAT|' ivrbroker.log|grep '|F|'
EXSTAT|IVR|2014|11|17|14|43|57|1086|SRQCPE952|QCPE|F|100|349
EXSTAT|IVR|2014|11|17|15|35|51|1092|SRQCPE741|QCPE|F|100|204
但现在我正在寻找最大经过时间和最小经过时间,如下所示。
QCPE,2,276.5,349,204
bash-3.2$ grep '|F|' ivrbroker.log
EXSTAT|IVR|2014|11|17|14|43|57|1086|SRQCPE952|QCPE|F|100|349
EXSTAT|IVR|2014|11|17|15|35|51|1092|SRQCPE741|QCPE|F|100|204
bash-3.2$ awk -F'|' 'BEGIN { OFS="," }
/EXSTAT\|/ && /\|F\|/ { a[$11]++; c[$11] += $14;
if (a[$11]==1) { max[$11]=$14; min[$11]=$14; }
if($14 > max[$11]) max[$11]=$14; if($14 < min[$11]) min[$11]=$14; }
END { for(b in a) print b, a[b], c[b]/a[b], max[b], min[b] }' ivrbroker.log
,204,2,0,349
bash-3.2$ /usr/xpg4/bin/awk -F'|' 'BEGIN { OFS="," }
/EXSTAT\|/ && /\|F\|/ { a[$11]++; c[$11] += $14;
if (a[$11]==1) { max[$11]=$14; min[$11]=$14; }
if($14 > max[$11]) max[$11]=$14; if($14 < min[$11]) min[$11]=$14; }
END { for(b in a) print b, a[b], c[b]/a[b], max[b], min[b] }' ivrbroker.log
,204,2,276.5,349
bash-3.2$
【问题讨论】:
-
/usr/xpg4/bin/awk路径看起来你根本不在 Linux 上。标签linux 不正确吗?如果是这样,您在哪个平台上? -
bash-3.2$ uname -a SunOS utibcouat1 5.10 Generic_150400-13 sun4u sparc SUNW,Sun-Fire-V440 操作系统是 sun solaris 5.10。
-
我无法在 Linux 上轻松访问
sawk。如果您可以切换到gawk,我相信这应该可以解决任何剩余的兼容性问题。 -
更新答案时出现语法错误。我已经编辑并发布了输出以供参考。
-
不幸的是,我无法访问 SysV
awk进行测试。该脚本在mawk、nawk和gawk上运行良好。问题似乎与!($11 in max)表达式有关——我试图设计一个解决方法,但我不知道它是否会起作用。我再次更新了我的答案。