시간과 날짜 범위를 입력 매개 변수로 전달한 다음 이와 같은 로그 파일에 대해 실행한 다음 빈 줄 사이의 각 텍스트 블록에서 일치하는 패턴을 추출할 수 있는 논리를 찾으려고 합니다.
다음은 로그 파일의 샘플 콘텐츠입니다.
# 10/Oct/2017:11:14:12 -0400; conn=-1; op=59
dn: dc=capitalone,dc=com
changetype: modify
replace: ds-sync-state
ds-sync-state: 0000015b51d7bf33057e00000002
ds-sync-state: 0000015b53b701d30f0c00000003
ds-sync-state: 0000015b51d655e11a0c00000005
# 11/Oct/2017:10:40:29 -0400; conn=-1; op=44
dn: cn=schema
changetype: modify
replace: ds-sync-generation-id
ds-sync-generation-id: 8408
# 11/Oct/2017:10:40:30 -0400; conn=-1; op=59
dn: cn=admin data
changetype: modify
replace: ds-sync-state
ds-sync-state: 0000015b50e62ee409b700000002
ds-sync-state: 0000015b4a174d3f217500000002
ds-sync-state: 0000015b4ed4fcfb23a500000008
답변1
암소 비슷한 일종의 영양앗해결책:
lookup_by_daterange.awk
스크립트:
#!/usr/bin/awk -f
function get_ts(dt, ts){
gsub("/"," ",dt);
sub(":"," ", dt);
cmd="date -d \""dt"\" +%s";
while(cmd | getline t) ts=t;
close(cmd);
return ts
}
BEGIN {
from = get_ts(from); # `from` datetime
to = get_ts(to); # `to` datetime
}
/^# [0-9]{2}\//{
ts = get_ts($2);
if (ts >= from && ts <= to) {
f=1; n=NR+3
}
}
f && NR<=n {
print
}
NR==n {
print ""
}
용법:
awk -v from="11/Oct/2017:10:40:29" -v to="11/Oct/2017:10:41:00" -f lookup_by_daterange.awk logfile
산출:
# 11/Oct/2017:10:40:29 -0400; conn=-1; op=44
dn: cn=schema
changetype: modify
replace: ds-sync-generation-id
# 11/Oct/2017:10:40:30 -0400; conn=-1; op=59
dn: cn=admin data
changetype: modify
replace: ds-sync-state