시간/날짜 grep 15분

시간/날짜 grep 15분

특정 시간에 특정 유형의 행을 기록 해야 합니다 grep. 어떤 아이디어가 있습니까?

내 작업 스크립트는 다음과 같습니다.

cat *.log |grep -E '2011-06-30 (1[0-1]:[0-1][0-5]|10:16)'| grep -ach '0110 478655 ..  51' * | awk '{SUM += $1} END { print SUM }'

위 노선의 근무시간은 00:00~00:16 입니다. grep특정 시간에 대한 모든 결과를 요약해야 합니다 . 문자열을 어떻게 연결합니까 grep?

00:15-00:31, 00:30-00:46, 00:45-01:01 

시간도 가변적이어야 합니다. 즉, 항상 00:00-01:01이 되지는 않습니다. 이를 수행할 수 있는 방법이 있습니까?

답변1

정규식을 사용하여 시간을 일치시킬 수 있지만 이는 작업에 가장 적합한 도구는 아닙니다. 모든 로직을 awk에 넣고 수치 비교를 수행합니다.

Awk에는 날짜를 조작하기 위한 특정 도구가 없습니다. GNU awk는 mktimestrftime확장 기능을 제공합니다. 지정된 문제의 경우 이러한 확장이 필요하지 않지만 요구 사항이 더 복잡해지면 유용할 수 있습니다.

당신이 제공한 "작업" 스크립트는 아마도 당신이 작성하려고 했던 것이 아닐 것입니다. 두 번째 grep호출은 파일 이름을 인수( *)로 사용하므로 표준 입력에서 읽지 않습니다. 그리고 샘플 입력도 표시되지 않습니다. 그래서 나는 당신의 요구 사항이 무엇인지 모릅니다.

다음은 모든 로그 줄이 날짜로 시작하고 모든 로그 파일에서 일치하는 줄 끝에 나타나는 숫자를 합산하려고 한다고 가정하는 일부 샘플 코드입니다. 및 변수에 날짜를 전달하고 및 에 시작 시간을 전달 합니다 . year스 니펫은 15분 범위 내에서 로그 항목을 검색하므로 다른 날짜로 확장할 수 없습니다.monthdayhourminute

awk -vyear=2011 -vmonth=6 -vday=30 -vhour=0 -vminute=15 -vRS='[-: ]+' '
BEGIN {start = hour * 60 + min; stop = start + 15}
{time = $4 * 60 + $5}
$1==day && $2== month && $3==day && start <= time && time <= stop && $NF ~ /^[0-9]+$/ {
    sum += $NF
}
END {print sum}'

관련 정보