명령줄에서 Apache 로그 구문 분석(여러 구분 기호가 있는 로그)

명령줄에서 Apache 로그 구문 분석(여러 구분 기호가 있는 로그)

/var/log/apache2/other_vhosts_access.log명령줄에서 각 열의 값을 어떻게 구문 분석하고 가져올 수 있나요 ?

이것은 확실히 매우 일반적인 질문이며,나는 전에 시도했다awk, 그러나 다음과 같은 이유로 상황이 생각보다 간단하지 않습니다.

  • 공백은 구분 기호로 사용됩니다.
  • 따옴표 안에 있지 않는 한"Mozilla/5.0 (Windows NT 10.0; Win64;..."
  • []날짜 열의 경우

Debian에 구성된 표준 Apache 로깅 예:

www.example.com:443 1.2.3.4 - - [01/Feb/2021:15:07:35 +0100] "GET /index.html HTTP/1.1" 200 8317 "https://www.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"

예상되는 구문 분석에서는 다음 열 중 하나를 추출할 수 있어야 합니다.

www.example.com:443
1.2.3.4
-
-
[01/Feb/2021:15:07:35 +0100]
"GET /index.html HTTP/1.1" 
200 
8317 
"https://www.example.com/" 
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"

답변1

awkGNU 사용FPAT그리고 큰따옴표 안에 내부 큰따옴표가 없거나 괄호 안에 괄호가 없다고 가정합니다.

awk -v FPAT='"[^"]*"|\\[[^]]*\\]|[^ ]*' '{ for(i=1; i<=NF; i++) print $i }' infile

정규식은 실제로 일치합니다.char-X[not char-X]<zero-or-more-of-any-character-until>char-X그것을 봤다.

에서 본인간의 awk

FPAT
레코드의 필드 내용을 설명하는 정규식입니다. 설정되면 gawk는 FS 값을 필드 구분 기호로 사용하는 대신 필드가 정규식과 일치하는 필드로 입력을 구문 분석합니다.

답변2

날짜 비트(1) 주위에 큰따옴표를 추가하여 시작합니다. 이렇게 하면 구분 기호로 쉼표 대신 공백이 포함된 유효한 CSV 파일이 제공됩니다. 그런 다음 공백을 필드 구분 기호로 사용하여 CSV 구문 분석기를 사용하여 행을 CSV 레코드로 읽습니다(2). 구분 기호가 줄 바꿈(3)으로 설정된 레코드를 출력합니다. 완벽한.

  1. sed 's/\[/"&/; s/\]/&"/'
  2. cvsformat -H -d ' '(이것은 -H열 헤더가 있는 헤더 행을 읽는 것이 아닙니다.)
  3. csvformat -H -D $'\n'( $'...'"C 문자열"을 이해하는 쉘이 필요합니다. 예를 들어 bash그렇지 않으면 리터럴 줄 바꿈이 사용됩니다)

2단계와 3단계를 결합하여 다음을 얻을 수 있습니다.

sed 's/\[/"&/; s/\]/&"/' logfile | csvformat -H -d ' ' -D $'\n'

에 제공된 데이터를 logfile기반 으로

www.example.com:443
1.2.3.4
-
-
[01/Feb/2021:15:07:35 +0100]
GET /index.html HTTP/1.1
200
8317
https://www.example.com/
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36

더 이상 필요하지 않으므로 일부 항목에서 큰따옴표가 제거되었습니다.

csvformat의 일부입니다csvkit.

관련 정보