2010-07-12 48 views
0

我有一个用户提供日期,开始时间和结束时间的脚本。该脚本将采用这些值并扫描日志文件以搜索时间范围内的日志文件中的关键字。当用户使用上午时间(例如:0700至0900 - 这是上午7点至上午9点)作为范围或PM时间(例如:1400至1600 - 这是下午2点至4点)作为范围脚本工作正常。当他们使用AM开始时间(从零开始 - 0700)和结束时间(不以零开始 - 1000(这是上午10点)时,脚本不能正常工作。那我在与如何使用shell和awk在日志文件中搜索时间值?

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

你应该使用AWK的变量传递。你不必做所有那些尴尬的引用。

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

请勿使用cat。你可以这样做:

​​

< filename awk ... 

此外,AWK可以做grepping并为你计算:

< $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}' 
+0

嗨丹尼斯,我想你的变化和我没有得到任何罪名。他们将成为零。我最初遇到的问题是,从开始的零开始,例如早上7点,用户输入为0700,并且输入时间为0959之后的任何时间。这是脚本无法工作的时间。如果两次都在0959之后或0959之前,该脚本就可以工作。让我知道你是否想让我试着在这里复制整个剧本。我觉得脚本中存在$ 1 $ 2的问题..由于某些原因,与日志文件中的时间值进行比较会导致问题 – user389721 2010-07-13 14:50:21

+0

@ user389721:试试这个:'startTime = 0700; ENDTIME = 1000;回声“09:30:02.222 sefsk”| awk(我的第一个AWK命令的其余部分)''。你应该得到完整的回显字符串。现在尝试使用您发布的行中的AWK部分。没有打印。你从这两个测试中得到了相同的结果吗? **另外**尝试在您发布的代码之前添加此代码,并在10之前/ 10之后尝试输入并发布它输出的内容:'echo“start:.. $ {startTime} .. end:。 。$ {endTime} ..“' – 2010-07-13 17:23:31

+0

嗨丹尼斯,我把我的头发拉出来后弄清楚了。这是我想出来的,它的效果很好。我可以使用更多的awk语句清理它,但我会采取我得到的。以下是新的固定行: echo“日志文件log $ logDate/$ logFileName中处理的$ {shipmentTags [$ i]}货件的数量为:'cat $ logDirectory/log $ logDate/$ logFileName | awk -F: - v start = $ startTime -v end = $ endTime'(($ 1 $ 2)+ 0)> = start &&(($ 1 $ 2)+ 0)<= end {print $ 0}'| grep $ {shipmentStrings [$ i]} | wc -l'“ 谢谢你的所有帮助,虽然..让我走向正确的方向。 – user389721 2010-07-13 21:26:09