2016-02-11 1 views
0

Я придумал приведенный ниже сценарий, чтобы перечислять вызовы, длина которых превышает 10000000 микросекунд (ServiceDuration в наших журналах имеет значение, зарегистрированное в микросекундах) из файла журнала сервера, который хранит все вызовы, поступающие в службу.AWK Неожиданная ошибка маркера

servicedurationlimit.awk

#!/bin/sh 
dir1=$1/*.log 

# for each log file in the input dir 
for file1 in $dir1 
do 
     echo $file1":" 
     awk '/#BeginLogEntry|ServiceDuration/ { 
       #get slow running service's information 
       if ($1 == "#BeginLogEntry") 
       { 
         split($0, a, "\t"); 
         servinfo=a[3]" ServiceAt:"a[2]; 
       } else { 
         getline; 
         if ($0 > 10000000) 
         { 
           print servinfo", ServDur:"$0 
         } 
       } 
     }' $file1 
done 

На запуске скрипта я получаю ниже ошибки:

./servicedurationlimit.awk /path/to/server/logs/ 
./servicedurationlimit.awk: line 12: syntax error near unexpected token `$0,' 
./servicedurationlimit.awk: line 12: `     split($0, a, "\t"); ' 

Можете ли вы помочь мне понять, что может быть причиной этого?

Ниже приведен файл журнала образца (который имеет 2 записей журнала):

#BeginLogEntry 04.13 20:11:11.671 BROWSE_ALL 
@Properties LocalData 
IsJson=1 
UserTimeZone=utc 
@end 
@IdcRSet AuditProps 
2 
auditPropertyKey 
auditPropertyValue 
ServiceDuration 
62818 
ServiceStartTime 
{ts '2015-04-13 20:11:11.671'} 
@end 
#EndLogEntry 04.13 20:11:11.671 BROWSE_ALL 
#BeginLogEntry 04.13 21:12:11.671 BROWSE_SOME 
@Properties LocalData 
IsJson=1 
UserTimeZone=utc 
@end 
@IdcRSet AuditProps 
2 
auditPropertyKey 
auditPropertyValue 
ServiceDuration 
162818123 
ServiceStartTime 
{ts '2015-04-13 21:12:11.671'} 
@end 
#EndLogEntry 04.13 21:12:11.671 BROWSE_SOME 

Ниже выход я ожидал после выполнения сценария на лог-файл, содержащий выше записей.

BROWSE_SOME ServiceAt:04.13 21:12:11.671, ServDur: 162818123 

awk Информация о версии

$ awk --version 
GNU Awk 3.1.5 
+0

Что должно выводиться с данным примером журнала? – jkdba

+0

@JohnK - Обновлен пост с ожидаемым выходом. – vk239

ответ

5

Я бегу GNU Awk 4.0.2 и ваш код дает эту ошибку на моей коробке:

awk: cmd. line:2:  #get slow running services 
awk: cmd. line:2:  ^syntax error 
./test.sh: line 11: syntax error near unexpected token `$0,' 
./test.sh: line 11: `  split($0, a, "\t");' 

Однако я полагаю, вам просто нужно удалить ' одинарная коментария:

#get slow running service's 
+0

Это решило это. Похоже, 'gawk' не позволяет' '' в комментариях. Тот же скрипт отлично справился с реализацией 'awk'' BusyBox v1.19.2'. – vk239

+2

Затем разорвана оболочка BusyBox v1.19.2. Это поведение не имеет ничего общего с awk - никакая оболочка не будет разрешать одиночные кавычки в любом месте сценария с разделителями одной кавычки, независимо от того, будет ли инструмент, выполняющий скрипт, awk или sed или grep или что-то еще. –