【问题标题】:How to grep a log file content within a particular timestamp range in Linux? [duplicate]如何在Linux中的特定时间戳范围内grep日志文件内容? [复制]
【发布时间】:2013-02-15 17:43:51
【问题描述】:

我有一个日志文件,里面有以下格式的数据

[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 作为参数传递??

【问题讨论】:

    标签: linux bash awk grep pattern-matching


    【解决方案1】:

    您只需要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 三次。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-31
          • 1970-01-01
          相关资源
          最近更新 更多