有哪些方法可以按日期对apache日志进行排序?

时间:2018-12-27 18:59:49

标签: python-3.x apache datetime

我正在编写一个脚本,该脚本读取apache日志并将每行的IP地址和日期附加到两个列表中,即list_date和list_ip。我想对list_date进行排序,以便能够首先打印从最早的日期开始的所有日期。

我已经尝试过在Stackoverflow上寻找答案,但是由于所有的帖子和答案似乎都是PHP或其他语言,因此我没有发现任何有用的东西。

这是apache日志中的行:

Function GetTime(s$)
    With CreateObject("VBScript.RegExp")
        .Pattern = "\d{2}h\d{2}m\d{2}s"
        GetTime = .Execute(s)(0)
    End With
End Function

Sub test()
    MsgBox GetTime("Farol de RC_Celulas de Cto_2018.12.26_07h47m50s.zip")
End Sub

这是我的代码当前的样子:

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)

理想情况下,我希望日期从最旧到最新排序。 之后,我想知道如何使IP地址根据日期进行排序。因为现在两个列表中的第一个都在同一行中(如果有意义)?

1 个答案:

答案 0 :(得分:0)

首先,我建议使用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

Date Format documentation

如果您只想对日期进行排序,可以不使用熊猫来运行

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']