ウェブログファイルから文字列を抽出する

ウェブログファイルから文字列を抽出する

YouTubeビデオのWebアクセスログを含むファイルがある場合、各行は再生回数であり、次の形式を持ちます。

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

1つの文字列にまとめてcsvに入れる方法がわかりません。

tr '\n' > file.csv

これは大容量ログファイルなので、Unixコマンドで効率的に処理できると思いました。 Unixコマンドを使用することとPythonでプログラムすること(各行を読み取り、文字列を操作してファイルに書き込む)の間に違いはありますか?

答え1

awkを使用することをお勧めします。

awk '{print $1,$4,$5;}' test.log

awk空白で各行を分割すると$1、、$2...などのフィールドを呼び出し、最初、4番目、5番目のフィールドを印刷して$4日付$5スタンプを設定できます。

答え2

RE置換は、、...に対応する値と間に値が割り当てられているsed場合に使用されます。\1\2\(\)

sed 's/\([0-9\.]\) - - \[\(.*\)\] "GET .*/\1, \2/' test.log

(もちろん括弧内のより正確なパターンに置き換えることができます)

答え3

Unixコマンドでは、次のコマンドを使用できますsed

sed -e 's/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*\[\(.*\)\].*/\1\t\3/' test.log

fileinputしかし、ログファイルが非常に大きい場合は、ライブラリやジェネレータを使用して大容量ファイルの処理をより効率的に処理できるため、Pythonを使用する方が良いと思います。

関連情報