Извлечь строки из файла веб-журнала

Дан файл, содержащий журналы веб-доступа для 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 справятся с этим эффективно. Есть ли разница между использованием команд unix или программированием на python (чтение каждой строки, управление строкой и затем запись в файл)?

0
28.02.2016, 15:28
3 ответа

Используйте замены RE в sed , здесь \ 1 , \ 2 , ... присваиваются значения между соответствующими \ ( и \)

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

(убедитесь, что вы можете подставить в скобки более точные шаблоны)

0
28.01.2020, 04:52

С помощью команды unix вы можете использовать следующую sed

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

Но если файл журнала очень большой, я думаю, было бы лучше использовать Python, поскольку он может более эффективно обрабатывать действия с большими файлами, например, библиотека fileinput или генератор.

-1
28.01.2020, 04:52

Лучше использовать awk,

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

awk разбивает каждую строку по интервалам, позволяя вам обращаться к полям как $ 1 , $ 2 и т. Д., А затем вы просто печатаете первую, четвертую и пятое поле ( 4 доллара и 5 долларов составляют штамп даты).

1
28.01.2020, 04:52

Теги

Похожие вопросы