我正在尝试提取两个时间戳之间的所有日志。有些行可能没有时间戳,但我希望包含这些行 - 我希望将属于两个时间戳的每一行包含在提取的日志中。提取的日志还应包含第一个和最后一个时间戳行。
注意:日志中可能不存在开始时间戳或结束时间戳,但我希望提取这两个时间戳之间的每一行。
我的日志时间戳结构如下所示:25-01-2017 07:06:16:860
我编写的 awk 命令是获取仅包含时间戳的行并跳过所有其他行及其获取日志 end_time-1 即如果我将 end_time 指定为 11:30 那么它的获取日志直到 11:29 或者有时非常奇怪也小于那个。
PFB 我写的命令:
awk -v date=${date} \
-v start_time=${start_time} \
-v end_time=${end_time} \
'{if (($0 >= date FS start_time) && ($0 <= date FS end_time)) print $0; }' \
$log.$server_name.log > $requester_email.log
请注意,此命令将位于一个脚本中,我要求用户手动输入详细信息,因此当我询问开始和结束时间时,用户必须以这种格式输入 HH:MM 即对于上述时间戳用户将输入类似的时间07:06
如果有人能在这里帮助我,我将非常感激。
日志示例:
25-01-2017 07:23:51:772 [DEBUG] - sdsdsadadjhadsjhasdjhajhdahdkjhadjkhasjkdhjhg asdgahdgasdhghasdghagdshdhasgadahdghasdgasd
25-01-2017 07:23:51:772 [DEBUG] - asdasd.asdasd.asdasdas.asdasd.asdasda.dfsfd.cxzzxczxczcwdqweqwe.adadsasd.asdasdasdadasdadasd.adadasdasdasd.as: adasdasdadadasdsdfsdfsdfsfssdf..<Request xmlns="adasdadasdasdasdasdasdasadadasd" xmlns:xsi="http://www.w3.org/2001/">
<Resource>
<Attribute AttributeId="asdasdasasdasdasdasdasdasdasdasddaasdasdasdasdaas" DataType="http://www.w3.org/2001/XMLSchema#string">
<AttributeValue>adasdasdasdasdasddasdasd</AttributeValue>
</Attribute>
<!--Check something somthing-->
<Attribute
AttributeId="asdasdasasdasdasdasdasdasdasdasddaasdasdasdasdaas" DataType="http://www.w3.org/2001/XMLSchema#string">
<AttributeValue>sdasddsd</AttributeValue>
</Attribute>
</Subject>
<Action>
<Attribute AttributeId="sdfsdfsdsdfsdfsdfsdfsdfsfxcvxvxcvvxvcxvwerqwr" DataType="http://www.w3.org/2001/XMLSchema#string">
<AttributeValue>rsf</AttributeValue>
</Attribute>
</Action>
</Request>
25-01-2017 07:23:51:775 [DEBUG] - sdsdsadadjhadsjhasdjhajhdahdkjhadjkhasjkdhjhg asdgahdgasdhghasdghagdshdhasgadahdghasdgasd
答案1
你的方法有两个问题:
- 您可以按字典顺序将整个输入行与时间戳进行比较。如果该行以结束时间戳开头并包含其他字符,则会对其进行排序后时间戳,因为较长的字符串排在较短的字符串之后。
- 您没有处理不以时间戳开头的行的规则。由于它们未在开始时间戳和结束时间戳之间排序,因此它们不会包含在输出中。这些线是如何识别的?
尝试这样的事情:
$1 == date {
start = substr($2, 0, length(start_time));
end = substr($2, 0, length(end_time));
if (start_time <= start && end <= end_time) print;
next;
}
{ print; }