如何从列表中排序数据?

时间:2019-05-23 13:28:43

标签: python

我正在研究从bash到python的脚本重建。 我列出了来自具有大量服务器和计算机的SQL输出的数据,这些数据在GLPI DB上一个月都没有更新。

在此列表中,我需要执行一些任务以获取正确的列表:

首先,数据类型为:

[OCS ID]

 servername01A-2015-05-15-13-42-25
 servernameB02-2018-03-25-05-32-35
 pt-clark-2018-09-25-14-10-05
 PT-Peter-2019-01-01-12-12-05
 G4535-2017-07-14-11-29-25
 G4535-2017-07-14-11-29-25
 g4535-2017-07-14-11-29-25
 pc-rescue-2013-11-11-11-12-05

现在,我需要:

  • 删除重复项
  • 删除ID“ -2017-07-14-11-29-25”的第二部分,仅保留主机名A01或pt-xxxx
  • 删除一些服务器(为此,我要排除列表服务器)
  • 删除所有以G ****或g ****开头的计算机
  • 删除所有以pt-或PT-,PC-,pc-开头的计算机

我尝试过的

 #exclusion file
    exclusion = open("./exclusion.list", "r")

    #data in
    data_in = open("./list_in", "r")

    #read files
    exclusion_lines = exclusion.readlines()
    data_lines = data_in.readlines()
  #start
    for a in data:
      Z = re.split("(.*)-([0-9]{4}.*)", a[1])
      matchPCPT = re.search("^([Pp][TtCc]-*)", Z[1])
      matchG = re.search("^([Gg][0-9]{4})", Z[1])
      if not matchPCPT and not matchG:
         print Z[1]

有了这个,我得到了这个输出:

servername01A
servernameB02
servernameB02
servernameB02
servername01A

还有一些我必须删除的服务器(带有排除列表)。

请,我需要一些帮助,我是python的新手。

祝你有美好的一天

编辑:

完整列表输入

mailsrv1a-2015-05-15-13-42-25
mailsrv1b-2015-05-15-13-42-25
mailsrv1c-2015-05-15-13-42-25
mailsrv1a-2015-05-15-13-42-25
datasrvA2-2016-05-15-23-25-25
datasrvB2-2016-05-15-23-25-25
datasrvB2-2016-05-15-23-25-25
g4535-2017-07-14-11-29-25
pc-rescue-2013-11-11-11-12-05
PT-Peter-2019-01-01-12-12-05
pt-clark-2018-09-25-14-10-05
G4535-2017-07-14-11-29-25
benchsrv01rt-2017-07-14-11-29-25
benchsrv02rt-2017-07-14-11-29-25
esxsrv01-2017-07-14-11-29-25
esxsrv02-2017-07-14-11-29-25
solaris10g-2017-07-14-11-29-25
solaris10g-2017-07-14-11-29-25
solaris30g-2017-07-14-11-29-25
test1t-2017-07-14-11-29-25
test2t-2017-07-14-11-29-25
test3t-2017-07-14-11-29-25
test4t-2017-07-14-11-29-25
test5t-2017-07-14-11-29-25

以下是要排除的服务器列表:

benchsrv01rt
benchsrv02rt
solaris30g
solaris10g
test*t

我可以在排除列表中使用正则表达式吗?

2 个答案:

答案 0 :(得分:0)

这是一个示例(其中包含一些Python列表理解)

# init list
datalist = [ 'servername01A-2015-05-15-13-42-25',
             'servernameB02-2018-03-25-05-32-35',
             'pt-clark-2018-09-25-14-10-05',
             'PT-Peter-2019-01-01-12-12-05',
             'G4535-2017-07-14-11-29-25',
             'G4535-2017-07-14-11-29-25',
             'g4535-2017-07-14-11-29-25',
             'pc-rescue-2013-11-11-11-12-05' ]

# 1. remove duplicates
datalist = list(set(datalist))

# 2. remove second part of ID
for i,data in enumerate(datalist):
    tmp = '-'.join([tmp_str for tmp_str in data.split('-') if not tmp_str.isdigit()]) 
    datalist[i] = tmp

# 3. remove some servers
# I skipped this step since you did not provide the list of servers to exclude

# 4. remove all computer which starting by G**** or g****
datalist = [d for d in datalist if not d.startswith("G") and not d.startswith("g") ]


# 5. remove all computer which starting by pt- or PT-, PC-, pc-
for prefix in ['pt-', 'PT-', 'PC-', 'pc-']:
    datalist = [d for d in datalist if not d.startswith(prefix) ]

# 6. sort
datalist = sorted(datalist)

最终输出是:

enter image description here

答案 1 :(得分:0)

您可以使用标准方法来处理字符串。

第二部分始终有20个字符,因此您可以使用切片[:-20]获取第一部分。

使用text.lower().startswith( ("g", "pt-", "pc-") )可以跳过一些名称。

您可以添加到列表中的正确名称(即result),并且可以检查它是否在此列表中以跳过重复的值。

text = ''' servername01A-2015-05-15-13-42-25
 servernameB02-2018-03-25-05-32-35
 pt-clark-2018-09-25-14-10-05
 PT-Peter-2019-01-01-12-12-05
 G4535-2017-07-14-11-29-25
 G4535-2017-07-14-11-29-25
 g4535-2017-07-14-11-29-25
 pc-rescue-2013-11-11-11-12-05
 example-2013-11-11-11-12-05'''

data = text.split('\n')

excluded = ['benchsrv01rt', 'benchsrv02rt', 'solaris30g', 'solaris10g']

result = []

for name in data:
    name = name.strip()
    name = name[:-20]
    if not name.lower().startswith(('g', 'pc-', 'pt-')):
        if name not in excluded and name not in result:
           result.append(name)

print(result)

唯一的问题可能是G4535中的数字(如果您确实需要用数字识别姓名),并且可能需要regex

    import re

    if not re.match('g[0-9]{4}|pc-|pt-', name, re.IGNORECASE):
        if name not in excluded and name not in result:
           result.append(name)

编辑:其他问题可能是test*t,可能还需要正则表达式。

import re

text = '''mailsrv1a-2015-05-15-13-42-25
mailsrv1b-2015-05-15-13-42-25
mailsrv1c-2015-05-15-13-42-25
mailsrv1a-2015-05-15-13-42-25
datasrvA2-2016-05-15-23-25-25
datasrvB2-2016-05-15-23-25-25
datasrvB2-2016-05-15-23-25-25
g4535-2017-07-14-11-29-25
pc-rescue-2013-11-11-11-12-05
PT-Peter-2019-01-01-12-12-05
pt-clark-2018-09-25-14-10-05
G4535-2017-07-14-11-29-25
benchsrv01rt-2017-07-14-11-29-25
benchsrv02rt-2017-07-14-11-29-25
esxsrv01-2017-07-14-11-29-25
esxsrv02-2017-07-14-11-29-25
solaris10g-2017-07-14-11-29-25
solaris10g-2017-07-14-11-29-25
solaris30g-2017-07-14-11-29-25
test1t-2017-07-14-11-29-25
test2t-2017-07-14-11-29-25
test3t-2017-07-14-11-29-25
test4t-2017-07-14-11-29-25
test5t-2017-07-14-11-29-25'''

data = text.split('\n')

excluded = ['benchsrv01rt', 'benchsrv02rt', 'solaris30g', 'solaris10g']

result = []

for name in data:
    name = name.strip()
    name = name[:-20]
    if not re.match('g[0-9]{4}|pc-|pt-|test[0-9]t', name, re.IGNORECASE):
        if name not in excluded and name not in result:
           result.append(name)

print(result)

编辑:您还可以使用列表excludedexcluded = '|'.join(excluded)创建可在re.match()中使用的正则表达式

excluded = [
    'benchsrv01rt',
    'benchsrv02rt',
    'solaris30g',
    'solaris10g',
    'g[0-9]{4}',
    'pc-',
    'pt-',
    'test[0-9]t',
]

excluded = '|'.join(excluded)
#print(excluded)

result = []

for name in data:
    name = name.strip()
    name = name[:-20]
    if not re.match(excluded, name, re.IGNORECASE):
        if not in result:
           result.append(name)

print(result)