날짜를 기준으로 큰 로그 파일을 더 작은 파일로 나누려고 합니다.
파일은 다음과 같은 형식이며 일부 줄에는 날짜가 없을 수 있습니다. 이러한 행은 이전 날짜 행에 포함되어야 합니다.
2014-04-07T23:59:58 CheckForCallAction [ERROR] Exception caught
Undated line 1
Undated line 2
2014-04-08T00:00:03 MobileAppRequestFilter [DEBUG] Action
undated line 3
2015-04-08T00:00:03 MobileAppRequestFilter [DEBUG] ActionB
내가 찾은두 타임스탬프 사이의 로그를 추출하는 방법내 로그 파일에 날짜 시작 부분에 "["가 포함되어 있지 않거나 날짜 끝 부분에 "]"가 포함되어 있지 않다는 점을 제외하면 이는 내가 원하는 것과 가깝습니다.
이 링크에 대한 명령은 다음과 같습니다.
awk -F'[[]|[]]' \
'$0 ~ /^\[/ && $2 >= "2014-04-07 23:00" { p=1 }
$0 ~ /^\[/ && $2 >= "2014-04-08 02:00" { p=0 }
p { print $0 }' > test1.log logwith[.log
며칠 동안 수정하려고 노력했지만 이해할 수 없는 것 같습니다.
원하는 개선 사항은 시작 및 종료 날짜를 지정할 필요가 없고 출력 파일의 이름을 자동으로 연도 또는 월별로 지정하는 것입니다.
답변1
필드 구분자 로 사용되며 T
날짜와 유사한 속성을 명시적으로 확인하는 문자열입니다. 예를 들어 연도별로 분할하면 다음과 같습니다.
awk -FT '($1~/^[0-9]+-[0-9]+-[0-9]+$/){d=substr($1,1,4)}{print > d".log"}' logfile
연도 + 월별:
awk -FT '($1~/^[0-9]+-[0-9]+-[0-9]+$/){split($1,d,"-")}{print > d[1]d[2]".log"}' logfile
여기서는 첫 번째 필드( 로 정의됨 T
, 즉 date로 시작하는 줄의 전체 날짜, 즉 이것이 -FT
의미함)가 로 구분된 3개의 숫자 집합인지 확인합니다 -
. 그렇다면 연도를 얻으려면 처음 4개 문자( d=substr($1,1,4)
)를 추출하고 월을 얻으려면 첫 번째 필드를 분할 -
하고 결과 문자열을 배열 d
( split($1,d,"-")
)에 저장하고 배열의 처음 두 요소( d[1]d[2]
)를 파일 이름으로 사용합니다.