我正在使用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的解决方案,但不适合我的情况。有人可以帮忙吗?
答案 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