![마지막 5분 동안의 데이터를 가져와서 열을 추가하고 실패한 출력에 번호를 매깁니다.](https://linux55.com/image/13224/%EB%A7%88%EC%A7%80%EB%A7%89%205%EB%B6%84%20%EB%8F%99%EC%95%88%EC%9D%98%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EA%B0%80%EC%A0%B8%EC%99%80%EC%84%9C%20%EC%97%B4%EC%9D%84%20%EC%B6%94%EA%B0%80%ED%95%98%EA%B3%A0%20%EC%8B%A4%ED%8C%A8%ED%95%9C%20%EC%B6%9C%EB%A0%A5%EC%97%90%20%EB%B2%88%ED%98%B8%EB%A5%BC%20%EB%A7%A4%EA%B9%81%EB%8B%88%EB%8B%A4..png)
다음 결과를 얻으려면 전문가의 조언이 필요합니다
입력하다
2020-01-09 15:39:39,sharm,07296,97
2020-01-09 15:40:40,SRI,6657,197
2020-01-09 15:42:40,rinku,null,0
2020-01-09 15:42:40,SVRMO,8588,39
2020-01-09 15:44:58,MASTA,093720,48
여기에서 마지막 5분 동안의 데이터를 가져옵니다. 15시 45분에 명령이 실행되었다고 가정하면 (15:40~15:45)의 데이터를 선택해야 합니다.
2020-01-09 15:40:40,SRI,6657,197
2020-01-09 15:42:40,rinku,null,0
2020-01-09 15:42:40,SVRMO,8588,39
2020-01-09 15:44:58,MASTA,093720,48
출력은
284,4,3
어디
- 284는 데이터의 마지막 행(197+0+39+48)의 합계를 표시합니다.
- 4 최근 5분 동안의 총 데이터 수를 표시합니다.
- 3 마지막 열 값이 0이 아닌 전체 데이터 수를 표시합니다(예: 값이 각각 197, 39, 48인 1, 3, 4행).
답변1
아래 명령은 awk
먼저 현재 및 지난 5분 날짜를 가져와 이를 에포크 시간(유닉스 시간) 그리고 설정시작 시간그리고시간의 최대그런 다음 읽은 각 행에 대해 첫 번째 필드 날짜 열을 epoch로 변환하고 시간이 startTime과 endTime 사이에 있는지 확인한 다음 필요한 계산을 수행합니다. 에서는 END
마지막 값 sum
과 계산된 변수를 total
인쇄 합니다.nonZero
awk -vstartTime="$(date -d'-5 minutes' '+%s')" \
-vendTime="$(date '+%s')" \
-F, '{ epoch="date -d\"" $1 "\" +%s"; epoch |getline timestamp; }
(timestamp>=startTime && timestamp<=endTime){ sum+=$NF; total++; if($NF!=0)nonZero++ }
END{ print sum, total, nonZero }' OFS=, infile
주어진 테스트 데이터를 수동으로 테스트합니다.
awk -vstartTime=1578571800 \
-vendTime=1578572100 \
-F, '{ epoch="date -d\"" $1 "\" +%s"; epoch |getline timestamp; }
(timestamp>=startTime && timestamp<=endTime){ sum+=$NF; total++; if($NF!=0)nonZero++ }
END{ print sum, total, nonZero }' OFS=, infile