grep 및 awk를 사용하여 로그 파일에서 특정 줄을 추출합니다.

grep 및 awk를 사용하여 로그 파일에서 특정 줄을 추출합니다.

특정 URL 상태가 "200 OK"로 응답하는지 알려주는 거대한 로그 파일(2천만 줄)이 있습니다.

첨부된 파일 이름과 함께 상태가 "200 OK"인 모든 URL을 추출하고 싶습니다.

입력 예:

Spider mode enabled. Check if remote file exists.
--2019-02-06 07:38:43--  https://www.example/download/123456789
Reusing existing connection to website.
HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Content-Type: application/zip
  Connection: keep-alive
  Status: 200 OK
  Content-Disposition: attachment; filename="myfile123.zip"
  Last-Modified: 2019-02-06 01:38:44 +0100
  Access-Control-Allow-Origin: *
  Cache-Control: private
  X-Runtime: 0.312890
  X-Frame-Options: SAMEORIGIN
  Access-Control-Request-Method: GET,OPTIONS
  X-Request-Id: 99920e01-d308-40ba-9461-74405e7df4b3
  Date: Wed, 06 Feb 2019 00:38:44 GMT 
  X-Powered-By: Phusion Passenger 5.1.11
  Server: nginx + Phusion Passenger 5.1.11
  X-Powered-By: cloud66
Length: unspecified [application/zip]
Last-modified header invalid -- time-stamp ignored.
Remote file exists.

Spider mode enabled. Check if remote file exists.
--2019-02-06 07:38:43--  https://www.example/download/234567890
Reusing existing connection to website.
HTTP request sent, awaiting response... 
  HTTP/1.1 404 Not Found
  Content-Type: text/html; charset=utf-8
  Connection: keep-alive
  Status: 404 Not Found
  Cache-Control: no-cache
  Access-Control-Allow-Origin: *
  X-Runtime: 0.020718
  X-Frame-Options: SAMEORIGIN
  Access-Control-Request-Method: GET,OPTIONS
  X-Request-Id: bc20626b-095f-4b28-8322-ad3f294e4ee2
  Date: Wed, 06 Feb 2019 00:37:42 GMT
  X-Powered-By: Phusion Passenger 5.1.11
  Server: nginx + Phusion Passenger 5.1.11
Remote file does not exist -- broken link!!!

원하는 출력:

https://www.example/download/123456789 myfile123.zip

나는 마침내 이것의 논리를 이해하고 싶습니다.

내가 이렇게 하면:

awk '/: 200 OK/{print $0}' file.log

컨텍스트는 있지만 컨텍스트가 없는 모든 행을 얻습니다 Status: 200 OK.

내가 이렇게 하면:

grep -C4 "1 200 OK" file.log

맥락을 이해하지만 "소음"이 있습니다. 한 줄에서만 관련 정보를 얻을 수 있도록 출력을 다시 정렬하고 싶습니다.

답변1

awk다음과 같이 사용해야 합니다 . 먼저 URL을 변수에 저장하고, 다음 줄에서 파일 이름을 얻으면 해당 줄에 저장하세요 Status. 캡처된 그룹을 배열에 저장하려면 함수에 세 번째 매개변수가 필요하므로 GNU OK에서 작동해야 합니다 .awkmatch()

awk '/^--/{ url = $NF } 
    /^[[:space:]]+Status/ && $NF == "OK" { getline nextline; match(nextline, /filename="(.+)"/,arr); print url, arr[1] }' file

답변2

i=`awk '/Status: 200 OK/{x=NR+1}(NR<x){getline;print $NF}' filename | awk -F "=" '{print $NF}'| sed 's/"//g'`

awk '{a[++i]=$0}/Status: 200 OK/{for(x=NR-7;x<=NR;x++)print a[x]}' filename | awk -v i="$i" '/https:/{$1=$2="";print $0 " " i}'

산출

https://www.example/download/123456789 myfile123.zip

관련 정보