我的脚本获取DHCP租约并将其写入日志文件。
我只能在ip之后而不是日期对它进行排序。我从租约文件中获取信息并将其保存到列表中。这样1个租约= 1个列表元素。因此,我只能在第一个数字之后排序,即ip。
所以我认为我可以用bash命令对它进行排序,这是我的功能:
def bash_command(cmd):
subprocess.Popen(cmd, shell=True, executable="/bin/bash")
bash_command("cat log.txt | sort -n -t: -k2,2 > log2.txt")
现在,如果我运行我的脚本,它会生成log.txt和log2.txt,但都会使用ip进行排序。
log.txt中的一些示例:
lease 129.132.108.230 :starts 2015.06.15 17:15:37: ends 2015.06.15 17:16:02
lease 129.132.108.231 :starts 2015.06.16 15:17:32: ends 2015.06.16 15:17:59
lease 129.132.108.232 :starts 2015.06.24 11:40:41: ends 2015.06.24 12:52:26
lease 129.132.108.233 :starts 2015.06.22 06:52:01: ends 2015.06.22 06:46:31
lease 129.132.108.234 :starts 2015.06.19 12:02:01: ends 2015.06.19 12:00:02
lease 129.132.108.235 :starts 2015.06.18 23:12:36: ends 2015.06.18 23:12:35
编辑:我首先尝试在没有Bash的情况下解决我的问题。
#def extract_date(datetime):
# try:
# MyList.datetime.datetime.strptime (text.rsplit(None, 1)[-1], "%y/%m/%d %H:%M:%S;")
# return sorted(MyList)#, key=lambda datetime: datetime[2])
# except:
# pass
这个功能是我的第一次尝试。 这就是我在ip atm之后对它进行排序的方式:
if os.path.exists("/home/nraffael/log.txt"):
f=open("log.txt", "a")
sorted(MyList, key=lambda time: time[1])
for ele in sorted(MyList):
f.write(ele)
答案 0 :(得分:1)
来自sort
手册页:
-n, - 数字 - 根据字符串数值进行比较
事实是,而且ip不是一个数字,所以当你使用-n
时,你只是将数字与第一个非数字字符( ip地址中的第一个点)进行比较)。所以你只比较ip地址的第一个八位字节。
使用sort
对IP地址进行排序的方法如下:
sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
您只需要对其进行调整,以便从字符串中提取IP地址。
答案 1 :(得分:1)
这是一种在Python中对日志数据进行排序的简单方法,按开始日期排序:
data = '''
lease 129.132.108.230 :starts 2015.06.15 17:15:37: ends 2015.06.15 17:16:02
lease 129.132.108.231 :starts 2015.06.16 15:17:32: ends 2015.06.16 15:17:59
lease 129.132.108.232 :starts 2015.06.24 11:40:41: ends 2015.06.24 12:52:26
lease 129.132.108.233 :starts 2015.06.22 06:52:01: ends 2015.06.22 06:46:31
lease 129.132.108.234 :starts 2015.06.19 12:02:01: ends 2015.06.19 12:00:02
lease 129.132.108.235 :starts 2015.06.18 23:12:36: ends 2015.06.18 23:12:35
'''.splitlines()[1:]
for row in data:
print(row)
print('\nSorted by start date')
data.sort(key=lambda row: row.split()[3])
for row in data:
print(row)
<强>输出强>
lease 129.132.108.230 :starts 2015.06.15 17:15:37: ends 2015.06.15 17:16:02
lease 129.132.108.231 :starts 2015.06.16 15:17:32: ends 2015.06.16 15:17:59
lease 129.132.108.232 :starts 2015.06.24 11:40:41: ends 2015.06.24 12:52:26
lease 129.132.108.233 :starts 2015.06.22 06:52:01: ends 2015.06.22 06:46:31
lease 129.132.108.234 :starts 2015.06.19 12:02:01: ends 2015.06.19 12:00:02
lease 129.132.108.235 :starts 2015.06.18 23:12:36: ends 2015.06.18 23:12:35
Sorted by start date
lease 129.132.108.230 :starts 2015.06.15 17:15:37: ends 2015.06.15 17:16:02
lease 129.132.108.231 :starts 2015.06.16 15:17:32: ends 2015.06.16 15:17:59
lease 129.132.108.235 :starts 2015.06.18 23:12:36: ends 2015.06.18 23:12:35
lease 129.132.108.234 :starts 2015.06.19 12:02:01: ends 2015.06.19 12:00:02
lease 129.132.108.233 :starts 2015.06.22 06:52:01: ends 2015.06.22 06:46:31
lease 129.132.108.232 :starts 2015.06.24 11:40:41: ends 2015.06.24 12:52:26
要按开始日期和时间排序,只需将lambda
更改为
lambda row: row.split()[3:5]
我们可以在这里使用简单的字符串比较,因为日期和时间字段中的子字段(即,日,月,小时,分钟和秒)被填充为均匀长度。
答案 2 :(得分:1)
您可以通过使用datetime.strptime
解析开始日期和时间来使用python执行此操作:
lines = """lease 129.132.108.230 :starts 2015.06.15 17:15:37: ends 2015.06.15 17:16:02
lease 129.132.108.231 :starts 2015.06.16 15:17:32: ends 2015.06.16 15:17:59
lease 129.132.108.232 :starts 2015.06.24 11:40:41: ends 2015.06.24 12:52:26
lease 129.132.108.233 :starts 2015.06.22 06:52:01: ends 2015.06.22 06:46:31
lease 129.132.108.234 :starts 2015.06.19 12:02:01: ends 2015.06.19 12:00:02
lease 129.132.108.235 :starts 2015.06.18 23:12:36: ends 2015.06.18 23:12:35"""
from datetime import datetime
def key(x):
spl = x.split()
return datetime.strptime("{} {}".format(spl[3],spl[4]),"%Y.%m.%d %H:%M:%S:")
print(sorted(lines.splitlines(),key=key))
输出:
['lease 129.132.108.230 :starts 2015.06.15 17:15:37: ends 2015.06.15 17:16:02', 'lease 129.132.108.231 :starts 2015.06.16 15:17:32: ends 2015.06.16 15:17:59', 'lease 129.132.108.235 :starts 2015.06.18 23:12:36: ends 2015.06.18 23:12:35', 'lease 129.132.108.234 :starts 2015.06.19 12:02:01: ends 2015.06.19 12:00:02', 'lease 129.132.108.233 :starts 2015.06.22 06:52:01: ends 2015.06.22 06:46:31', 'lease 129.132.108.232 :starts 2015.06.24 11:40:41: ends 2015.06.24 12:52:26']
答案 3 :(得分:1)
你的问题是排序,而不是Python。虽然使用Python-intern解决方案可能更可取,但您的程序可以保持原样并且可以轻松纠正。
只需使用:
sort -t: -k +2
而不是
sort -n -t: -k2,2
您不需要选项-n
,因为您的日期格式正确(即使使用前导零),因此正常的ASCII排序会对它们进行排序。