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

使用sed在一个时间间隔内打印日志记录,sed,Sed,我正在使用sed在一个时间间隔内打印日志记录。我的时间格式是YYYY-MM-DD HH:MM:ss,sss,例如“2014-07-22 15:33:25758”。我试过了 sed -n '/2014-07-23 01:00:00,000/,/2014-07-23 02:00:00,000/ p' 但它不起作用。我可以找到YYYY-MM-DD的解决方案,但不适合我的情况。有人能帮忙吗?您可以用替换不重要的数字,以便匹配范围内的任何内容: sed -n '/2014-07-23 01:..:..,

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

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

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

您可以用
替换不重要的数字,以便匹配范围内的任何内容:

sed -n '/2014-07-23 01:..:..,.../,/2014-07-23 02:..:..,.../p'
也许干脆把它们全部去掉:

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

您可以将不重要的数字替换为
,使其匹配范围内的任何数字:

sed -n '/2014-07-23 01:..:..,.../,/2014-07-23 02:..:..,.../p'
也许干脆把它们全部去掉:

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

要使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
gawk-vstart=“2014 07 23 01 00”-vend=“2014 07 23 02 00”
开始{nstart=mktime(开始);nend=mktime(结束)}
{
t=$1”“$2
gsub(/[-:]/,“”,t);
nt=mktime(substr(t,1,19))

如果(nt>=nstart&&nt要使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
gawk-vstart=“2014 07 23 01 00”-vend=“2014 07 23 02 00”
开始{nstart=mktime(开始);nend=mktime(结束)}
{
t=$1”“$2
gsub(/[-:]/,“”,t);
nt=mktime(substr(t,1,19))

如果(nt>=nstart&&nt最终,
sed
不是这项工作的最佳工具;它进行精确匹配,而不是基于范围的匹配(在正则表达式的精确范围内)

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

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

其中,
{print}
是可选但明确的。ISO 8601日期和时间符号的优点之一就是字典顺序与时间顺序完全相同。

归根结底,
sed
不是此项工作的最佳工具;它进行精确匹配,而不是基于范围的匹配(在正则表达式的精确范围内)

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

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

其中,
{print}
是可选但明确的。ISO 8601日期和时间符号的优点之一就是字典顺序与时间顺序完全相同。

只有当
2014-07-23 01:00:00000
2014-07-23 02:00:00000
实际在您的输入中时,它才会起作用。只有
2014-07-23 01:00:00000
而且
2014-07-23 02:00:00000实际上在您的输入中。非常好,简单的解决方案。当然,只适用于某些时间间隔,但仍然非常适用。基本上很好,但请注意,如果有2014-07-23 01:59:59的条目,那么下一个条目是2014-07-23 03:01:01(可能是在冬季和夏季之间切换,但在02:00:00..02:59:59范围内没有输入,则打印不会停止。最终,
sed
不是作业的正确工具。非常好、简单的解决方案。当然,仅适用于某些类型的间隔,但仍然非常适用。基本上很好,但请注意,如果存在n 2014-07-23 01:59:59的条目,然后下一个条目是2014-07-23 03:01:01(可能是在冬季和夏季之间切换,但在02:00:00..02:59:59范围内没有条目,那么打印就不会停止。最终,
sed
不是该工作的正确工具。哇。观点不错。看起来字典排序就是所需的一切。哇。观点不错。看起来字典排序就是所需的一切。