특정 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
에서 작동해야 합니다 .awk
match()
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