2013-06-05 3 views
1

Я пытаюсь вычислить время отклика Avg на почасовой основе из файла журнала, который имеет миллионы записей, ниже есть выдержка из журналаCompute Среднее время отклика на почасовой основе

В настоящее время я пытаюсь с созданием temproary файл, который будет иметь строки с уникальным идентификатором и временем начала и окончания времени, а после этого другой скрипт будет работать в этом временном файле на время отклика avg для каждого часа. . Мой сценарий занимает более часа, чтобы создать временный файл.

Есть ли способ нам это сделать быстрее? или лучший скрипт, время которого меньше. Примечание. Эти UNIQID не поступают последовательно.

log file format 
2012-06-04 13:04:19,324 UNIQID1 
2012-06-04 13:04:20,120 UNIQID1 
2012-06-04 13:05:19,324 UNIQID2 
2012-06-04 13:06:20,120 UNIQID2 
2012-06-04 13:07:19,324 UNIQID3 
2012-06-04 13:08:20,120 UNIQID3 
2012-06-04 13:08:49,324 UNIQID4 
2012-06-04 13:09:50,120 UNIQID4 

Вот мой код:

uids=`cat $i|grep "UNIQ" |sort -u` >> $log 
for uid in ${uids}; do 
    count=`grep "$uid" test.log|wc -l` 
    if [ "${count}" -ne "0" ]; then 
     unique_uids[counter]="$uid" 
     let counter=counter+1 
    fi 
done 


echo ${unique_uids[@]} 
echo $counter 
echo " Unique No:" ${#unique_uids[@]} 
echo uid StartTime EndTime" > $log 

for unique_uids in ${unique_uids[@]} ; do 
    responseTime=`cat $i|grep "${unique_uids}" |awk '{split($2,Arr,":|,"); print Arr[1]*3600000+Arr[2]*60000+Arr[3]*1000+Arr[4]}'|sort -n` 
    echo $unique_uids $responseTime >> $log 
done 

Спасибо за ваше время!

+1

Это принадлежит на codereview.stackexchange.com. – chepner

+0

Вы работаете в Linux-системе с Gnu awk? –

ответ

1

Некоторые простые исправления:

  • Вам не нужно cat звонки; просто используйте имя файла в качестве последнего параметра для grep.
  • Вы не должны сохранять значения в как файл и переменную; использовать то, что быстрее. Обычно вам тоже не нужно использовать; цикл while IFS= read -r date time id, вероятно, будет быстрее.
+0

Спасибо, я попробую это. – JSR

0

В вашем сценарии есть несколько проблем, и я думаю, что вы найдете что-то подобное ниже, чтобы лучше соответствовать вашим потребностям. Во-первых, вам не нужно создавать все эти процессы для выполнения этой работы - достаточно просто сделать это внутри awk. Кроме того, введенный вами код предполагает, что конкретный UNIQID будет происходить только в ту же дату. Это предположение вызовет много горя, если ваши записи обернутся около полуночи на следующий день.

Следующий код делает то, что вы хотите, внутри сценария awk. Предполагается, что вы используете gawk (Gnu awk). Если нет, то вы можете найти awk реализаций на указываете ей веб including here

BEGIN { 
    while (getline < UIDFILE) { 
    x[$0] = 1;   # Awk will maintain these as an associative array, lookups are hashed 
    } 
} 


{ 
    r = $NF;     # Extract the unique ID from the record into r 
    if (r in x) {    # If the UID is something we are interested in, then ... 
    ts = $1 " " $2;   # concatenate these fields 
    gsub ("[:-]", " ", ts); # Replace the : and - with spaces 
    gsub (",.*", "", ts); # Remove everything after the comma 
    # print ts, mktime(ts) # If you want to see what mktime does 

    if (x[r] == "")   # First time seeing this unique ID? 
     x[r] = mktime(ts); # Store the timestamp 
    else {     # We're seeing it the second time 
     now = mktime(ts)  # Keep track of the current log time 
     rt = now - x[r];  # Compute the delta 
     delete (x[r])   # We don't need it any more 
     # printf "Record <%s> has response time %f\n", r, rt; # Print it out if you'd like 
     hourrt += rt;   # Add it to this hour's total response time 
     num++;    # And also keep track of how many records we have ending in this hour 
     if (now % 3600 == 0) { # Have we switched to a new hour? 
      printf "Average response time = %f\n", hourrt/num; # Dump the average 
      num = hourrt = 0; 
     } 
    } 
    } 
} 

Вам нужно будет вызывать этот скрипт следующим образом:

gawk -v UIDFILE=name_of_uid_file -f scriptname.awk 
+0

Спасибо Рам за ваши предложения. Да, я согласен с тем, что я новичок в написании сценариев, чтобы вы могли видеть стиль новичка в коде. Я использую GNU AWK. Я попробую это и дам вам знать результат. – JSR

+0

Привет, Рам, я столкнулся с проблемой при запуске этого кода. Я составил этот test.awk и команду m, используя: awk -f test.awk test.log> output.log – JSR

+0

Фактически я использую другой awk, чтобы получить uid в файле журнала и помещать их в массив. Поэтому, используя ur awk, я не могу передать этот uid на ваш awk. вот код для получения uid uids = 'cat $ i | grep" Service "| awk 'BEGIN {FS =" lt; "; RS =" gt; "} {print $ 2;}' | sort -u' – JSR

Смежные вопросы