使用sed在一个时间间隔内打印日志记录

时间:2014-07-24 15:02:37

标签: sed

我正在使用sed在一个时间间隔内打印日志记录。我的时间格式是YYYY-MM-DD HH:MM:ss,sss,例如" 2014-07-22 15:33:25,758"。我试过了

sed -n '/2014-07-23 01:00:00,000/,/2014-07-23 02:00:00,000/ p'

但它不起作用。我可以找到YYYY-MM-DD的解决方案,但不适合我的情况。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

您可以使用.替换无效数字,以便它匹配范围内的任何内容:

sed -n '/2014-07-23 01:..:..,.../,/2014-07-23 02:..:..,.../p'

也许只是完全删除它们:

sed -n '/2014-07-23 01:/,/2014-07-23 02:/p'

答案 1 :(得分:2)

最终,sed不是这项工作的最佳工具;它完全匹配而不是基于范围的匹配(在正则表达式的精确性内)。

使用awk,您可以进行基于范围的检查:

awk '$1 == "2014-07-23" && $2 >= "01:00:00" && $2 < "02:00:00" { print }'

{ print }是可选的但是显式的。 ISO 8601日期和时间符号的一个优点正是词典顺序与时间顺序相同。

答案 2 :(得分:1)

要使sed命令起作用,这些确切的时间必须出现在文件中。 konsolebox有一个很好的解决方案,应该适用于您的情况(但请参阅Jonathan Leffler在那里的评论,以及他的awk解决方案,比我的简单)。

一般来说,你需要比sed更强大的东西,比如awk。在下面的示例中,请注意您必须如何指定输入时间(空格分隔值,秒数无小数)。另请注意,它特定于gawk。另请注意,我假设时间是第一个和第二个空格分隔的字段。根据需要进行调整。

gawk -vstart="2014 07 23 01 00 00" -vend="2014 07 23 02 00 00" '
  BEGIN {nstart=mktime(start); nend=mktime(end)}
  {
    t = $1 " " $2
    gsub(/[-:]/, " ", t);
    nt = mktime(substr(t, 1, 19))
    if (nt >= nstart && nt <= nend)
      print
  }
' file