我的python函数有什么问题?

时间:2015-08-03 13:26:12

标签: python bash sorting

我的脚本获取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)

4 个答案:

答案 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排序会对它们进行排序。