2

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

[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

这很好用,但问题是我如何传递13619898001362076199作为参数?

4

3 回答 3

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是打印。

于 2013-03-01T09:16:47.953 回答
1

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

grep qa-hadoop1 input | grep CRITICAL| grep NOTIFICATION | \
  awk -F, -v b=1361989800 -v e=1362076199 \
    '{ if ( $1 > "["b"]" && $1<"["e"]") print }'
于 2013-03-01T09:16:04.917 回答
0

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

FS如果您想比较if报表中的日期,则应该是空格。

如果您-F,从 awk 行部分中删除它可能会起作用。试试看。

更简单,你可以采取[or ]as FS

于 2013-03-01T09:43:03.873 回答