我正在使用 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
,但在两个日期之间的第一行输入范围,并且仅当我们找到时间戳大于结束日期的行时才保留它。