使用 awk 想要提取两个时间戳之间的日志

使用 awk 想要提取两个时间戳之间的日志

我正在尝试提取两个时间戳之间的所有日志。有些行可能没有时间戳,但我希望包含这些行 - 我希望将属于两个时间戳的每一行包含在提取的日志中。提取的日志还应包含第一个和最后一个时间戳行。

注意:日志中可能不存在开始时间戳或结束时间戳,但我希望提取这两个时间戳之间的每一行。

我的日志时间戳结构如下所示: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. 您可以按字典顺序将整个输入行与时间戳进行比较。如果该行以结束时间戳开头并包含其他字符,则会对其进行排序时间戳,因为较长的字符串排在较短的字符串之后。
  2. 您没有处理不以时间戳开头的行的规则。由于它们未在开始时间戳和结束时间戳之间排序,因此它们不会包含在输出中。这些线是如何识别的?

尝试这样的事情:

$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; }

相关内容