2013-03-01 124 views
2

我有一个日志文件,该文件有下列格式如何在Linux中对特定时间戳范围内的日志文件内容进行grep?

[1361991081] SERVICE NOTIFICATION: qreda;qa-hadoop1;CPU Load;CRITICAL;notify-service-by-email;CRITICAL - load average: 18.29, 18.14, 18.10 
[1361991371] SERVICE NOTIFICATION: qreda;CRITICAL-SERVICES_FOR_LAST_24_HOURS;qa-hadoop1:Critical Services;CRITICAL;notify-service-by-email;CPU Load,Memory, 
[1361994681] SERVICE NOTIFICATION: qreda;qa-hadoop1;CPU Load;CRITICAL;notify-service-by-email;CRITICAL - load average: 18.02, 18.06, 18.11 
[1361994971] SERVICE NOTIFICATION: qreda;CRITICAL-SERVICES_FOR_LAST_24_HOURS;qa-hadoop1:Critical Services;CRITICAL;notify-service-by-email;CPU Load,Memory, 

我包含了所有在过去的7个days.I的数据要到grep这个文件,以示对昨天在日志数据。这里的日期显示为时间戳。我使用下面的命令

cat /usr/local/nagios/var/nagios.log |grep qa-hadoop1|grep CRITICAL|grep NOTIFICATION | awk -F, '{ if ($1>"[1361989800]" && $1<"[1362076199]") print }' 

其中1361989800Thu Feb 28 00:00:00 IST 2013

1362076199所计算的时间戳值是用于Thu Feb 28 23:59:59 IST 2013所计算的时间戳值。

这很好,但问题是我如何通过13619898001362076199作为参数?

回答

1

下面是使用命令行参数分配的一种方式:

grep qa-hadoop1 input | grep CRITICAL| grep NOTIFICATION | \ 
    awk -F, -v b=1361989800 -v e=1362076199 \ 
    '{ if ($1 > "["b"]" && $1<"["e"]") print }' 
2

你只需要awk这一点。

awk -va=1361989800 -vb=1362076199 '{gsub(/[][]/,"")}/qa-hadoop1|CRITICAL|NOTIFICATION/&&$1>a&&$1<b' file 

-v选项允许您传递变量。另外通过使用gsub来删除第一个字段上的整数比较的括号(空格分隔不是逗号即)


注:

grep读取文件,因此你不需要cat file | grep 'pattern'只是grep 'pattern' file也可以使用像交替所以egrep 'qa-hadoop1|CRITICAL|NOTIFICATION' file你不需要管grep三次。

awkish版本的awk -F, '{ if ($1>"[1361989800]" && $1<"[1362076199]") print }'awk -F, '$1>"[1361989800]" && $1<"[1362076199]"'你不需要if结构和默认块awk是打印。

0

除了你的cat|grep|grep|grep|awk,我会问,你为什么设置逗号,为awk的FS,后来比较$ 1与时间戳? $ 1是从开始到第一个逗号,这是不正确的。

FS应该是空格,如果你想比较日期,就像在你的if报表中一样。

它可能工作,如果您从您的awk行部分删除-F,。尝试一下。

更简单,你可以采取[]作为FS

相关问题