如何使用shell和awk在日志文件中搜索时间值?

时间:2010-07-12 18:05:24

标签: linux shell awk

我有一个脚本,用户提供日期,开始时间和结束时间。该脚本将获取这些值并扫描日志文件以搜索日志文件中属于该时间范围内的关键字。当用户使用AM时间(例如:0700到0900 - 这是早上7点到早上9点)作为范围或PM时间(例如:1400到1600 - 这是下午2点到下午4点)作为范围,脚本可以正常工作。当他们使用AM开始时间(以零 - 0700开始)和结束时间(不是从零开始 - 1000(这是上午10点)时,脚本无法正常运行。

以下是我遇到问题

的问题
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 个答案:

答案 0 :(得分:1)

你应该使用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"

甚至让AWK脚本中的END子句打印消息:

< $logDirectory/log$logDate/$logFileName \
awk ... -v file=$logDirectory/log$logDate/$logFileName \
    '... END {print "Number of "selection" shipments ... "file" ... is: " count}'
相关问题