如果最后一个模式不满足,Sed 范围问题

如果最后一个模式不满足,Sed 范围问题

我正在使用 sed 进行范围搜索。我想解析从日期和时间2016-09-29 01:00到 的日志数据2016-09-29 01:30。这就是为什么我一直使用以下命令,

$ sed -n '/2016-09-29 01:/,/2016-09-29 01:30:.*$/p'

但问题是,如果 1:30 在日志中不可用,那么它将返回所有日志到末尾。

那么如何处理这个问题,以便如果1:30不存在,它将转到下一条记录,直到结束。

需要考虑的事项:日志包含堆栈跟踪因此包含堆栈跟踪的行不以日期开头。

答案1

没那么奇怪。sed是一个s特雷姆编辑itor,它会在行出现时对其进行处理。像这样的范围/a/,/b/意味着一旦找到该行就选择该行,找到a后就不再选择该行。b如果b从未找到,它永远不会停止选择行。

在这里,你应该改用awk。假设这些时间戳位于行的开头:

awk '$0 >= "2016-09-29 01:" && $0 < "2016-09-29 01:30"'

请注意,它只会选择具有范围内时间戳的行,因此会排除没有时间戳的行,即使它们位于具有范围内时间戳的行之间。

另一种解决这个问题的方法是:

awk -v start='2016-09-29 01:' -v end='2016-09-29 01:30' '
  $0 >= start && $0 <= end, /^[0-9]{4}([ :-][0-9]{2}){5}/ && $0 >= end'

即使用类似 in 的范围sed,但在两个日期之间的第一行输入范围,并且仅当我们找到时间戳大于结束日期的行时才保留它。

相关内容