Как я могу сократить вывод строк, которые были записаны в текстовый файл - PullRequest
0 голосов
/ 19 сентября 2019

Я пишу скрипт для ssh для всех коммутаторов, которые у меня есть, запускаю команду, затем беру выходные данные и отправляю их в текстовый файл.Однако вывод, который я получаю, должен быть отфильтрован до нескольких полезных вещей.Мне нужно только знать интерфейс и VLAN, он включен.Я написал другой скрипт, чтобы взять текстовый файл, созданный первым, который выполняет фильтрацию текста, но этого недостаточно.Я опубликую код для обеих целей, чтобы вы могли понять полный контекст

f = open("vlancheck.txt", "a+")
hostname = "host here"
port = 22
username = getpass.getpass(prompt="Username: ") #used for hiding input
password = getpass.getpass()
command = "show interface status | e disabled"
string = " "

ssh = paramiko.SSHClient() #starts ssh client
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #generates ssh key for all unknown hosts
ssh.connect(hostname, port=port, username=username, password=password) # logs in with the credentials stored in variables


stdin, stdout, stderr = ssh.exec_command(command) #manages input,output, and error data generated by the command sent
output = stdout.readlines() #reads the output as a list
print("\n".join(output))
f.write(hostname)
f.writelines(output) # writes the output as a list
f.close()
open("truncated.txt" , "w+").writelines([line for line in open("vlancheck.txt") if "Gi" in line])

Я работаю с коммутаторами cisco, и это вывод, который я получаю со своим скриптом фильтра:

Gi1/0/6 connected 708 a-full a-100 10/100/1000BaseTX Gi1/0/9 connected 708 a-full a-100 10/100/1000BaseTX

Это хорошо, но я хочу сократить его до что-то вроде:

Gi1/0/6 connected 708 Gi1/0/9 connected 708

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Если вы хотите этот вывод Gi1/0/9 connected 70

Используйте regix re.sub()

Вот как вы его используете.

print re.sub(' +', ' ',output)

Это устранит дублирующиеся пробелы впеременная, которую вы используете

0 голосов
/ 20 сентября 2019

спасибо за помощь.Я действительно понял это сам.Я выложу, что я сделал.Это, вероятно, не самый лучший, но он определенно работает!

with open("hosts.txt") as l:
    line = l.readline()
    print(line)
    while line is not None:
        for host in line:
            host = "".join(line)
            host = host.strip('\n')
            #print(host)
            ssh = paramiko.SSHClient() #starts ssh client
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #generates ssh key for all unknown hosts
            ssh.connect(host, port=port, username=username, password=password) # logs in with the credentials stored in variables
            stdin, stdout, stderr = ssh.exec_command(command) #manages input,output, and error data generated by the command sent
            output = stdout.readlines() #reads the output as a list
            #print("\n".join(output))
            f.write(host + "\n")
            for i in output:
                if i.startswith("Gi"):
                    f.writelines(i[0:46] + "\n") # writes the output as a list
            line = l.readline()
0 голосов
/ 19 сентября 2019

Итак, если я правильно понимаю ваш вопрос и код, который вы указали ... ваш вывод Gi1/0/6 connected 708 a-full a-100 10/100/1000BaseTX отображается в этой строке: print("\n".join(output))

Предполагая, что ваша выходная переменная - это список, у меня естьсоздал образец ниже:

output = ['Gi1/0/6','connected','708', 'a-full','a-100','10/100/1000BaseTX']
print('    '.join(output[0:3]))

возвращает:

Gi1/0/6     connected     708
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...