awk命令从日志中打印最大最小值

时间:2014-11-20 07:16:48

标签: shell awk solaris sunos

我正在使用成功标志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$ 

1 个答案:

答案 0 :(得分:4)

您需要再添加两个数组变量来跟踪最小值和最大值。

当你在这里时,摆脱grep | awk反模式。

awk -F'|' 'BEGIN { OFS="," }
    /EXSTAT\|/ && /\|F\|/ { a[$11]++; c[$11] += $14;
        if (!($11 in max)) max[$11]=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

看起来第一个条件可能是$1 == "EXSTAT" && $12 == "F",因为它的易读性和精确度略有提高。也可以将a重命名为count,将c重命名为sum

上述脚本适用于Linux,但显然不适用于SunOS / SysV / XPG4 Awk。也许尝试这个小修改:

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