Команда Awk вывести максимальные минимальные значения из журнала
Я делаю grep
с флагом успеха S. $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 ответ
Вам нужно добавить еще две переменные массива, чтобы отслеживать минимальное и максимальное значения.
Пока вы на это, избавьтесь от 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