날짜를 기준으로 대용량 로그 파일을 여러 부분으로 분할

날짜를 기준으로 대용량 로그 파일을 여러 부분으로 분할

날짜를 기준으로 대용량 로그 파일을 여러 부분으로 분할하는 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 파일의 첫 번째 줄이 생성됩니다.

결과는 나를 매우 혼란스럽게 만들었습니다. 특히:

  1. array[1]같고 [30같지 않습니까 124.115.5.11 - - [30?

  2. array[3]같고 2011:23:21:37같지 않습니까 2011:00:36:35 -0500] "GET?

  3. 왜 비어 있나요 array[4]?

  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

관련 정보