특정 시간에 특정 유형의 행을 기록 해야 합니다 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는 mktime
및 strftime
확장 기능을 제공합니다. 지정된 문제의 경우 이러한 확장이 필요하지 않지만 요구 사항이 더 복잡해지면 유용할 수 있습니다.
당신이 제공한 "작업" 스크립트는 아마도 당신이 작성하려고 했던 것이 아닐 것입니다. 두 번째 grep
호출은 파일 이름을 인수( *
)로 사용하므로 표준 입력에서 읽지 않습니다. 그리고 샘플 입력도 표시되지 않습니다. 그래서 나는 당신의 요구 사항이 무엇인지 모릅니다.
다음은 모든 로그 줄이 날짜로 시작하고 모든 로그 파일에서 일치하는 줄 끝에 나타나는 숫자를 합산하려고 한다고 가정하는 일부 샘플 코드입니다. 및 변수에 날짜를 전달하고 및 에 시작 시간을 전달 합니다 . year
스 니펫은 15분 범위 내에서 로그 항목을 검색하므로 다른 날짜로 확장할 수 없습니다.month
day
hour
minute
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}'