我有一个日志文件,其中包含以下格式的数据
[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 }'
其中1361989800
是Thu Feb 28 00:00:00 IST 2013
和1362076199
是Thu Feb 28 23:59:59 IST 2013
的计算时间戳值。
这很有效,但问题是如何将1361989800
和1362076199
作为参数传递?
答案 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
。