Как я могу присоединить строку к его значению? - PullRequest
1 голос
/ 18 июня 2020

Прежде всего, у меня есть эта строка из вывода команды S SH (есть еще много узлов со всеми томами и датами:

vserver           volume                                           last-success-op-end      
----------------- ------------------------------------------------ ------------------------ 
xxx_xxx_xxx_xxxxx trident_pvc_387e46bc_7fad_4424_95d4_ab15a3e156a8 Mon Jun 10 16:52:18 2020 
xxx_xxx_xxx_xxxxx trident_pvc_42816b6e_cd61_4929_a7c2_41de3f593c23 Mon Jun 15 16:52:35 2020 
xxx_xxx_xxx_xxxxx trident_pvc_5932a33a_ca9f_4131_8d2b_e465f195c633 Mon Jun 15 16:52:29 2020 
xxx_xxx_xxx_xxxxx trident_pvc_769d0605_1964_4dfe_9792_1d84e331519f Mon Jun 15 18:25:30 2020 

Тогда я бы хотел взять все те серверы, где их последняя успешная операция старше 7 дней, и получить такой вывод:

xxx_xxx_xxx_xxxxx.trident_pvc_387e46bc_7fad_4424_95d4_ab15a3e156a8= 7 days;

Я пробовал сделать это:

import subprocess
import argparse
import sys
import re
import datetime
from subprocess import check_output

command = #ssh command that returns me that string 
output = check_output(command, shell=True)

#Here I take all the dates
dates_1 = str(re.findall('(Mon.*|Sun.*|Tue.*|Wed.*|Thu.*|Fri.*|Sat.*|Sun.*)', output)).replace("\\r", "").replace(" '", "'").replace("'", "").replace("[", "").replace("]", "")
dateslist = dates_1.split(",")


dates_list = [datetime.datetime.strptime(date, "%a %b %d %H:%M:%S %Y").date() for date in dateslist]

now = datetime.datetime.now().date()

deltas = [now-d for d in dates_list]

delta_days = [td.days for td in deltas]

results = map(int, delta_days)


print (results)

При этом я получаю такой вывод:

[3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 3, 5, 5, 4, 4, 4, 4, 4, 4, 0, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 17, 17, 0, 0, 0, 0, 0, 10, 8, 3, 3, 4, 4, 4, 4, 4, 3, 7, 56, 0, 2, 28, 17, 1, 4, 2, 0, 2, 2, 2, 37, 2, 2, 2, 6, 2, 2, 2, 3, 2, 0, 2, 0, 2, 7, 0, 0, 1032, 0, 0, 26, 4, 3, 4, 4, 4, 0, 6, 4, 645, 241, 141, 141, 322, 303, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Но я не нахожу информации о том, как связать эти значения с его томом vserver + и распечатать его ...

Есть способ сделать это?

Большое спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

пример того, как это можно сделать, используя структуру pandas DataFrame:

from io import StringIO
import pandas as pd

# example input
s = ("vserver           volume                                           last-success-op-end     \n"
     "----------------- ------------------------------------------------ ------------------------\n"
     "xxx_xxx_xxx_xxxxx trident_pvc_387e46bc_7fad_4424_95d4_ab15a3e156a8 Mon Jun 10 16:52:18 2020\n"
     "xxx_xxx_xxx_xxxxx trident_pvc_42816b6e_cd61_4929_a7c2_41de3f593c23 Mon Jun 15 16:52:35 2020\n")

# remove the first two lines with s.split('\n')[2:]
# update the separators in the input to get 3 columns (replace first two spaces with ,)
s = '\n'.join([','.join(l.split(' ', 2)) for l in s.split('\n')[2:]]).strip()

# load input to DataFrame
df = pd.read_csv(StringIO(s), names=['vserver', 'volume', 'last-success-op-end'])

# parse last-success-op-end column to datetime
df['last-success-op-end'] = pd.to_datetime(df['last-success-op-end'], format="%a %b %d %H:%M:%S %Y")

# now you can easily calculate the 'age' of a log entry against a reference date:
ref_date = pd.to_datetime('today')
df['age_days'] = (ref_date-df['last-success-op-end']).dt.total_seconds() / 86400

# df
#              vserver  ...  age_days
# 0  xxx_xxx_xxx_xxxxx  ...  7.915218
# 1  xxx_xxx_xxx_xxxxx  ...  2.915021
#
# [2 rows x 4 columns]
1 голос
/ 18 июня 2020

Ваш список results - это список, длина которого равна количеству строк, полученных из вывода команды ssh.

, если вы можете получить том vserver + из output а также список, вы можете использовать понимание списка и условное выражение для выбора тех, которые вас интересуют:

vserver = str(re.findall(.... # here you would need to identify all vserver accesses
vserver_select = [vs for (vs, i) in enumerate(vserver) if result[i] > 7]

Это выбирает все обращения к серверу, которые старше 7 дней.

...