날짜를 기준으로 대용량 로그 파일을 여러 부분으로 분할하는 Linux 명령을 작성하려고 합니다.
사용기존 아파치 로그 파일을 월별로 분할하는 방법은 무엇입니까?시작점으로 다음을 시도했습니다.
awk '{ split($4,array,"/"); print > array[2] ".txt" }' TestLog.txt
내 예제 TestLog.txt(다양한 연도의 5월, 6월, 7월 항목 포함)에서는 May.txt, Jun.txt 및 Jul.txt라는 텍스트 파일이 생성됩니다.
배열의 값을 이해하기 위해 출력 파일을 제거하고 다음을 사용하여 배열 값을 표시했습니다.
awk '{ split($4,array,"/"); print array[1] " " array[2] " " array[3] " " array[4] }' TestLog.txt
TestLog.txt의 처음 두 줄은 다음과 같습니다.
124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"
58.61.164.39 - - [31/May/2011:00:36:35 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"
그러면 [30 May 2011:23:21:37
파일의 첫 번째 줄이 생성됩니다.
결과는 나를 매우 혼란스럽게 만들었습니다. 특히:
왜
array[1]
같고[30
같지 않습니까124.115.5.11 - - [30
?왜
array[3]
같고2011:23:21:37
같지 않습니까2011:00:36:35 -0500] "GET
?왜 비어 있나요
array[4]
?의 가치는 얼마가 되어야 하는가
array[0]
?
답변1
첫 번째 줄을 살펴보겠습니다.
124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET / HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)"
이 스니펫의 핵심 부분은 다음과 같습니다 awk
.
awk '{ split($4,array,"/") ...
일어나는 일은 다음과 같습니다.
awk
공백에서 줄 실행 및 분할(기본 필드 구분 기호)4
일이 행의 필드/
도 문자를 기준으로 분할됩니다.- 분할 결과는
array
array[2]
그런 다음 전체 행이 네 번째 필드의 두 번째 하위 필드라는 파일에 인쇄됩니다( ).
so $4
필드에는 처음에 가 포함되어 [30/May/2011:23:21:37
있으며 분할 후
array[1]=[30
array[2]=May
array[3]=2011:23:21:37
아니요 array[4]
(첫 번째 4
필드에 첫 번째 "하위 필드"가 포함되어 있지 않기 때문 4
), 아니오( 배열 인덱스가 1에서 시작하기 array[0]
때문 ).awk