awk를 사용하여 두 타임스탬프 사이의 로그 추출

awk를 사용하여 두 타임스탬프 사이의 로그 추출

두 타임스탬프 사이의 모든 로그를 추출하려고 합니다. 일부 행에는 타임스탬프가 없을 수도 있지만 해당 행을 포함하고 싶습니다. 두 개의 타임스탬프에 속하는 모든 행이 추출된 로그에 포함되기를 원합니다. 추출된 로그에는 첫 번째 및 마지막 타임스탬프 줄도 포함되어야 합니다.

참고: 시작 타임스탬프 또는 종료 타임스탬프가 로그에 없을 수도 있지만 이 두 타임스탬프 사이의 모든 행을 추출하고 싶습니다.

내 로그 타임스탬프 구조는 다음과 같습니다.2017년 1월 25일 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; }

관련 정보