Как найти значение времени в файле журнала, используя shell и awk? - PullRequest
0 голосов
/ 12 июля 2010

У меня есть скрипт, в котором пользователь указывает дату, время начала и время окончания.Сценарий примет эти значения и просканирует файл журнала, чтобы найти ключевые слова в файле журнала, которые попадают в диапазон времени.Когда пользователь использует время AM (пример: с 07:00 до 09:00 - это с 7:00 до 9:00) как диапазон, или время PM (например: с 14:00 до 1600 - это с 14:00 до 16:00), в качестве диапазона сценарий работает нормально.когда они используют время начала AM (начиная с нуля - 0700) и время окончания (не начинается с нуля - 1000 (это 10:00), скрипт не работает должным образом.

Вот строкаНа вопрос, что у меня проблемы с

echo "Number of ${shipmentTags[$i]} shipments processed in \
    log file log$logDate/$logFileName is:
    `cat $logDirectory/log$logDate/$logFileName | 
        awk -F":" '$1$2 >= '"$startTime"' && $1$2 <= '"$endTime"' {print $0}' |
        grep ${shipmentStrings[$i]} | 
        wc -l`" 

Спасибо. Я скопировал сюда только некоторые фиктивные данные о том, как будет выглядеть журнал.

07:00:01.124 dfsdfjsdflkjsdfkljsdflkjEDIRequestServiceModule/Routedasdfkl
07:05:02.123 fsldjfsdfskdfjsdfsdkfjEDIRequestServiceModule/Rouedsdfjsdfj
07:10:33.233 sdkjfasdflkjasdfaskdfjasdfkljEDIRequestServiceModule/Routed
09:30:02.222 sefsklfjsdfljksdfEDIRequestServiceModule/Routedasdfdf
14:00:12.222 sdfsdfsdfsdfsdfsdfEDIRequestServiceModule/Routed sdfsdfs
14:01:22.223 sdfsdfsdfsdfsdfsdfsdfEDIRequestServiceModule/Routed sdfsdfsdf
17:00:22.222 sdfsdfsdfsdfsdfsdfEDIRequestServiceModule/Routedsdfsdfsdf
18:00:33.333 sdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdf

Если кто-то захочетпосмотрите весь сценарий, просто ответьте, и я могу вырезать и вставить его сюда.

1 Ответ

1 голос
/ 12 июля 2010

Вы должны использовать передачу переменных AWK. Вам не придется делать все это неловкое цитирование.

awk -F":" -v start=$startTIME -v end=$endTime '$1$2 >= start && $1$2 <= end {print $0}'

Не используйте cat. Вы можете сделать:

awk ... filename

или

< filename awk ... 

Кроме того, AWK может выполнить подсчет и подсчет для вас:

< $logDirectory/log$logDate/$logFileName awk -F":" -v start=$startTIME -v end=$endTime -v selection=${shipmentStrings[$i]} '$0 ~ selection { if ($1$2 >= start && $1$2 <= end) count++} END {print count}'

Кроме того, вам, вероятно, следует использовать переменную и сократить echo. И используйте $() вместо кавычек:

shipmentcount=$(... awk ...)
echo "Number of ... is: $shipmentcount"

Или даже позволить предложению END в сценарии AWK напечатать сообщение:

< $logDirectory/log$logDate/$logFileName \
awk ... -v file=$logDirectory/log$logDate/$logFileName \
    '... END {print "Number of "selection" shipments ... "file" ... is: " count}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...