YouTube 동영상에 대한 웹 액세스 로그가 포함된 파일이 있는 경우 각 줄은 조회수이며 다음과 같은 형식을 갖습니다.
62.172.72.131 - - [02/Jan/2003:02:06:41 -0700] "GET /random/html/riaa_hacked/ HTTP/1.0" 200 10564 "-" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0; WWP 17 August 2001)"
63.194.21.74 - - [30/Apr/2003:13:13:22 -0700] "GET /random/video/Star_Wars_Kid_Remix.wmv HTTP/1.1" 206 1146708 "-" "NSPlayer/9.0.0.2980 WMFSDK/9.0"
161.114.88.73 - - [02/May/2003:03:27:41 -0700] "GET /random/video/Star_Wars_Kid.php HTTP/1.0" 302 1 "http://friends.portalofevil.com/sp.php?si=3&fi=FRIENDSOF&ti=1000489621&pi=1000489621" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; compaq)"
64.164.63.70 - - [02/May/2003:13:24:19 -0700] "GET /random/video/Star_Wars_Kid.wmv HTTP/1.1" 302 307 "http://blogdex.media.mit.edu/" "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)"
IP 주소와 날짜를 대괄호로 묶어서 csv 파일에 넣어야 합니다.ip_address,date
다음 명령을 사용하여 각각 IP와 날짜를 가져옵니다.
grep -oP '([0-9]{1,3}\.){3}[0-9]{1,3}' test.log
grep -oP "\[\K[^\]]+" test.log
그것을 하나의 문자열로 결합하여 csv에 넣는 방법을 모르겠습니다.
tr '\n' > file.csv
이것은 대용량 로그 파일이기 때문에 유닉스 명령으로 효율적으로 처리할 수 있을 것이라고 생각했습니다. Unix 명령을 사용하는 것과 Python으로 프로그래밍하는 것(각 줄을 읽고 문자열을 조작한 다음 파일에 쓰기) 사이에 차이가 있습니까?
답변1
awk를 사용하는 것이 좋습니다.
awk '{print $1,$4,$5;}' test.log
awk
공백으로 각 줄을 나누면 $1
, $2
, ... 등의 필드를 호출한 다음 첫 번째, 네 번째 및 다섯 번째 필드를 인쇄하고 $4
날짜 $5
스탬프를 구성할 수 있습니다.
답변2
RE 대체는 , , ...에 해당 및 사이에 값이 할당되는 sed
경우 에 사용됩니다 .\1
\2
\(
\)
sed 's/\([0-9\.]\) - - \[\(.*\)\] "GET .*/\1, \2/' test.log
(물론 괄호 안의 더 정확한 패턴으로 대체할 수 있습니다)
답변3
유닉스 명령을 통해 다음 명령을 사용할 수 있습니다sed
sed -e 's/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*\[\(.*\)\].*/\1\t\3/' test.log
fileinput
하지만 로그 파일이 매우 큰 경우 라이브러리나 생성기를 사용하여 대용량 파일에 대한 작업을 보다 효율적으로 처리 할 수 있으므로 Python을 사용하는 것이 더 좋다고 생각합니다 .