2014-11-20 81 views
0

grep 성공 플래그 S로 처리하고 있습니다. $ 11은 서비스 유형이고 $ 12는 S (성공) 또는 F (실패)이며 경과 시간은 $ 14입니다. 명령 아래 나는 평균 경과 시간이 있습니다.Awk 명령은 로그에서 최대 최소 값을 인쇄합니다.

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$ 
+0

'/ usr/xpg4/bin/awk' 경로는 리눅스에서 전혀 보이지 않는 것처럼 보입니다. 태그 [tag : linux]가 올바르지 않습니까? 그렇다면 어떤 플랫폼을 사용하고 있습니까? – tripleee

+0

bash-3.2 $ uname -a SunOS utibcouat1 5.10 Generic_150400-13 sun4u sparc SUNW, Sun-Fire-V440 OS는 sun solaris 5.10입니다. – Guru

+0

Linux에서'sawk '에 쉽게 액세스 할 수 없습니다. 'gawk'로 전환 할 수 있다면 나머지 호환성 문제를 고쳐야한다고 생각합니다. – tripleee

답변

4

당신은 최소 및 최대 추적하기 위해 두 개 더 배열 변수를 추가해야합니다.

당신이 그것에있는 동안, grep | awk 반 패턴을 제거하십시오. 아마도 첫 번째 조건이 약간 개선 가독성과 정확성을 위해 $1 == "EXSTAT" && $12 == "F"을해야처럼

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 

보인다. 어쩌면 acountc ~ 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 
+0

나는 게시물을 편집했다. 출력이 올바르지 않습니다. 확인해주십시오. – Guru

+1

그동안 답변을 업데이트했습니다. 내 원래 답변은 게시 한 샘플 데이터 (2 줄)에 적용됩니다. 예제가 대표가 아닌 경우 업데이트하십시오. – tripleee

+0

귀하의 답변은 완벽하게 이식 가능하며 모든 최신 awk에서 작동합니다. OP에서 구문 오류가 발생하면 올바르게 복사하거나 붙여 넣지 않았거나 오래된 awk (Solaris의/bin/awk)를 실행하려고했습니다. –