2013-05-14 4 views
-1

저는 스크립팅의 초보자이며 도움이 필요합니다. 로그 파일이 있는데, 그 로그 파일은 지워졌습니다. 보이는이 (millisec의 시간, 지속 시간(), 액션) 같은 :셸의 로그 분석 스크립트

2012-04-28 00:00:00;277.406; 
2012-04-28 00:00:00;299.680; 
2012-04-28 00:00:00;282.338; 
2012-02-28 00:00:00;272.241; 

내가 시간 데이터를 사용하는 스크립트를 만들어 작업을 계산해야합니다.

+2

를 얻을 : 나는 확실히 헤더와 값을 잘 줄 수 있도록이 유사한의 printf 형식 문자열을 사용 : //mattgemmell.com/2008/12/08/what-have-you-tried/)? 그리고 그 질문은 무엇입니까? – creinig

+0

Awk Tutorial (http://www.grymoire.com/Unix/Awk.html)과이 질문 (http://stackoverflow.com/questions/10047817/parsing-log-lines-using-awk)을보십시오. –

+0

감사합니다. Awk는 나의 첫 번째 생각 이었지만, 이제 그 모든 것. 나는 붙어있다. –

답변

0

먼저 다른 필드를 쉽게 파싱 할 수 있도록해야합니다. 간단한 방법은

tr ";" " " <logfile|awkscript 

둘째를 사용하여 공간에 세미콜론을 변경하는 것입니다, 당신은 낮은과 높은 값의 테이블을 작성해야합니다. 색인이 열의 이름 인 연관 배열을 사용하고 있습니다. 나는 BEGIN 섹션에서 이것을한다.

값이 낮은 값과 높은 값 사이에 있으면 계산해야합니다. 중간 섹션에서이 작업을 수행합니다.

END 섹션에서 값을 출력합니다. 나는 당신의 데이터를이 프로그램을 실행할 때

#!/usr/bin/awk -f 
BEGIN { 
    low["<1ms"]=0;high["<1ms"]=1 
    low["1-10ms"]=1;high["1-10ms"]=10 
    low["10-100ms"]=10;high["10-100ms"]=100 
    low["100-500ms"]=100;high["100-500ms"]=500 
    low[">500ms"]=500;high[">500ms"]=1000000000 
} 
{ 
# Middle section - for each line 
duration=$3 

for (i in high) { 
    if ((duration > low[i]) && (duration <= high[i])) { 
#  printf("duration: %d, low: %s,high: %s\n", duration, low[i], high[i]); 
     total+=duration # total duration 
     bin[i]++ # store a count into different bins 
     count++ # total number of measurements 
    } 
} 
} 
END { 
average=total/count 
FMT="%-10s %10s %10s %10s %10s %10s\n" 
NFMT="%-10.3f %10s %10s %10s %10s %10s\n" 
printf(FMT,"AVG", "<1ms", "1-10ms", "10-100ms", "100-500ms", "500+ms") 
printf(NFMT,average, bin["<1ms"], bin["1-10ms"], bin["10-100ms"], bin["100-500m\ 
s"], bin["500+ms"]) 

} 

, 나는 [당신이 시도 무엇] (HTTP를

AVG    <1ms  1-10ms 10-100ms 100-500ms  500+ms 

282.916            4 
+0

감사합니다. 위대한 작품! –