다음 로그 항목이 이전 로그 항목보다 1분 이상 늦게 발생한 횟수를 계산합니다.

다음 로그 항목이 이전 로그 항목보다 1분 이상 늦게 발생한 횟수를 계산합니다.

날짜, 시간(시, 분, 초, 밀리초), 차량 속도, 차량과 우리 차량 앞뒤 차량 사이의 자유 거리를 기록하는 로그 파일이 있습니다. 차량이 정지된 경우에는 거리를 측정하지 않습니다.

selfdriving.log파일은 다음과 같습니다.

2021.04.01. 13:14:30:78 78 110 110
2021.04.01. 13:14:30:99 79 111 111
2021.04.01. 13:14:31:50 80 111 119
2021.04.01. 13:14:59:87 87 118 117
2021.04.01. 13:16:59:87 86 116 119
2021.04.01. 13:17:22:32 75 117 115
2021.04.01. 13:18:50:65 75 96 109
2021.04.01. 13:18:55:00 0 0 0

내가 원하는 것은 마지막 로그 항목 이후 1분 이상 후에 로그 항목이 생성된 횟수를 반환하는 스크립트를 작성하는 것입니다. 따라서 내 계산이 정확하다면 2이 경우 반환되어야 합니다. grep작동 방식과 반환 값을 변수에 넣는 방법을 이해하지 못합니다 . 지금까지 나는 다음을 시도했습니다.

#!/bin/sh

for i in "cat selfdriving.log"
do
  grep (([01][0-9])|(2[0-3])):[0-5][0-9]:[0-5][0-9]:[0-9][0-9]
done

제가 아는 한, 평가는 높지 않습니다.

답변1

시간을 비교해야 하는 문제에 대한 해결책은 날짜/시간을 정수 초로 변환하는 것입니다. 그런 다음 이전 레코드의 타임스탬프를 기억하면 연산을 수행하여 60초보다 큰 차이를 찾을 수 있습니다.

GNU awk는일부 내장 시간 함수

gawk -F'[. :]+' '
    {timestamp = mktime($1" "$2" "$3" "$4" "$5" "$6)}
    NR == 1 {prev = timestamp}
    timestamp - prev >= 60 {print}
    {prev = timestamp}
' selfdriving.log
2021.04.01. 13:16:59:87 86 116 119
2021.04.01. 13:18:50:65 75 96 109

가능한 레코드 수를 얻으려면

  1. 출력을 파이프하여 | wc -l개수를 얻거나
  2. awk에서 계산을 수행하고 결과를 END 블록에 인쇄합니다.

관련 정보