Какие есть способы сортировки журнала Apache по дате? - PullRequest
0 голосов
/ 27 декабря 2018

Я пишу скрипт, который читает журнал apache и добавляет IP-адрес и дату из каждой строки в два списка list_date и list_ip.Я хочу отсортировать list_date, чтобы иметь возможность печатать все даты, начиная с самой старой даты.

Я пытался искать ответы здесь в Stackoverflow, но ничего полезного не видел, так как всепосты и ответы кажутся написанными с помощью PHP или другого языка.

Вот как выглядит строка в журнале apache:

109.169.248.247 - - [12/Dec/2015:18:25:11 +0100] "GET /administrator/ HTTP/1.1" 200 4263 "-" "Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0" "-"

И вот как выглядит мой код в настоящее время:

list_ip = []
list_date =[]
with open('accseslogsmall.txt') as f:
    for line in f:
        IP, date = line.partition("]")[0].split(" - - [")
        list_date.append(date)
        list_ip.append(IP)

print(list_date)
print(list_ip)

Вот что я получаю в настоящее время:

['12/Dec/2015:18:25:11 +0100', '12/Dec/2015:18:25:11 +0100', '12/Dec/2015:18:31:08 +0100', '12/Dec/2015:18:31:08 +0100', '12/Dec/2015:18:31:25 +0100']
['109.169.248.247', '109.169.248.247', '46.72.177.4', '46.72.177.4', '83.167.113.100']

И в идеале, я бы хотел, чтобы даты сортировались от самых старых к самым новым.После этого мне хотелось бы узнать, как я делаю IP-адреса для сортировки по датам.Потому что сейчас первые в обоих списках находятся в одной строке (если это имеет смысл?)

1 Ответ

0 голосов
/ 27 декабря 2018

Прежде всего, я бы предложил использовать модуль datetime , чтобы представлять строки Date как объекты даты в Python.

import pandas as pd
from datetime import datetime

list_date = ['12/Dec/2015:18:25:11 +0100', '12/Dec/2015:18:31:08 +0100', '12/Dec/2015:18:31:25 +0100',
             '12/Dec/2016:18:25:11 +0100', '11/Dec/2015:18:31:08 +0100', '13/Dec/2015:18:31:08 +0100']
# Parse the date strings into date objects, you can read more about the format in the link
_list_date = [datetime.strptime(i, '%d/%b/%Y:%H:%M:%S %z') for i in list_date]
list_ip = ['10.0.0.11', '10.0.0.22', '10.0.0.13', '10.0.0.24', '10.0.0.15', '10.0.0.26']

# Creating a DataFrame with two columns Date and IP
df = pd.DataFrame({'Date': _list_date, 'IP': list_ip})
print(df)
                       Date         IP
0 2015-12-12 18:25:11+01:00  10.0.0.11
1 2015-12-12 18:31:08+01:00  10.0.0.22
2 2015-12-12 18:31:25+01:00  10.0.0.13
3 2016-12-12 18:25:11+01:00  10.0.0.24
4 2015-12-11 18:31:08+01:00  10.0.0.15
5 2015-12-13 18:31:08+01:00  10.0.0.26


# Sorting the DataFrame by date
df = df.sort_values('Date')
print(df)

                       Date         IP
4 2015-12-11 18:31:08+01:00  10.0.0.15
0 2015-12-12 18:25:11+01:00  10.0.0.11
1 2015-12-12 18:31:08+01:00  10.0.0.22
2 2015-12-12 18:31:25+01:00  10.0.0.13
5 2015-12-13 18:31:08+01:00  10.0.0.26
3 2016-12-12 18:25:11+01:00  10.0.0.24

Документация формата даты

Если вы просто хотите отсортировать даты, без использования панд вы можете запустить

print(sorted(list_date, key=lambda x: datetime.strptime(x, '%d/%b/%Y:%H:%M:%S %z')))
['11/Dec/2015:18:31:08 +0100', '12/Dec/2015:18:25:11 +0100', '12/Dec/2015:18:31:08 +0100', '12/Dec/2015:18:31:25 +0100', '13/Dec/2015:18:31:08 +0100', '12/Dec/2016:18:25:11 +0100']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...