我正在编写一个脚本,该脚本读取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地址根据日期进行排序。因为现在两个列表中的第一个都在同一行中(如果有意义)?
答案 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
如果您只想对日期进行排序,可以不使用熊猫来运行
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']