如何在Linux中的特定时间戳范围内grep日志文件内容?

时间:2013-03-01 09:08:19

标签: linux bash awk grep pattern-matching

我有一个日志文件,其中包含以下格式的数据

[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天的所有数据。我想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

的计算时间戳值

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

这很有效,但问题是如何将13619898001362076199作为参数传递?

3 个答案:

答案 0 :(得分: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 1}}三次。

awkish awk -F, '{ if ($1>"[1361989800]" && $1<"[1362076199]") print }' awk -F, '$1>"[1361989800]" && $1<"[1362076199]"'if版更新awk您不需要{{1}}构造,{{1}}中的默认块是打印版。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

FS应该是空格,如果您想比较if语句中的日期。

如果从awk行部分删除-F,,它可能会有效。试试吧。

更简单,您可以将[]作为FS