从 Web 日志文件中提取字符串

从 Web 日志文件中提取字符串

给定一个包含 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组成日期戳)。

答案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

但如果日志文件非常大,我认为最好使用Python,因为它可以使用fileinput库或生成器更有效地处理大文件上的操作。

相关内容