Преобразовать таблицу вывода команд в словарь - PullRequest
0 голосов
/ 23 февраля 2019

Я запускаю команду 'arp-scan -l' в сценарии.В настоящее время мой код возвращает результат строковой переменной:

192.168.200.1   90:ef:68:f8:8b:c2       ZyXEL Communications Corporation
192.168.200.81  60:45:cb:6c:5e:3e       (Unknown)
192.168.200.83  0c:fe:45:4b:b8:98       Sony Interactive Entertainment Inc.
192.168.200.106 ac:84:c6:57:f7:19       TP LINK
192.168.200.72  50:dc:e7:67:bd:e0       (Unknown)
192.168.200.157 5c:52:1e:59:2c:d1       TP LINK
192.168.200.229 f8:62:14:5a:9e:c7       (Unknown)

Если я просто разделю этот вывод, он создаст список примерно так: ('ip\mac\sony interactive entertainment')

Я бы хотел, чтобы вывод был: ('ip','mac','sony interactive entertainment')

Мой код пока:

arp_cmd = ['arp-scan', '-l']

run_command = subprocess.Popen(arp_cmd, stdout=subprocess.PIPE)
output_bytes = run_command.communicate()[0]
output_str = output_bytes.decode("utf-8")
print(output_str.split('/n'))

ВЫХОД:

['192.168.200.1\t90:ef:68:f8:8b:c2\tZyXEL Communications Corporation\n192.168.200.81\t60:45:cb:6c:5e:3e\t(Unknown)\n192.168.200.81\t60:45:cb:6c:5e:3e\t(Unknown) (DUP: 2)\n192.168.200.83\t0c:fe:45:4b:b8:98\tSony Interactive Entertainment Inc.\n192.168.200.83\t0c:fe:45:4b:b8:98\tSony Interactive Entertainment Inc. (DUP: 2)\n192.168.200.106\tac:84:c6:57:f7:19\t(Unknown)\n192.168.200.72\t50:dc:e7:67:bd:e0\t(Unknown)\n192.168.200.150\t5c:f9:38:d1:25:b5\tApple, Inc.\n192.168.200.150\t5c:f9:38:d1:25:b5\tApple, Inc. (DUP: 2)\n192.168.200.157\t5c:52:1e:59:2c:d1\t(Unknown)\n192.168.200.229\tf8:62:14:5a:9e:c7\t(Unknown)']

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Решение

Другой способ, которым я смог это сделать:

import re

s = """
192.168.200.1   90:ef:68:f8:8b:c2       ZyXEL Communications Corporation
192.168.200.81  60:45:cb:6c:5e:3e       (Unknown)
192.168.200.83  0c:fe:45:4b:b8:98       Sony Interactive Entertainment Inc.
192.168.200.106 ac:84:c6:57:f7:19       TP LINK
192.168.200.72  50:dc:e7:67:bd:e0       (Unknown)
192.168.200.157 5c:52:1e:59:2c:d1       TP LINK
192.168.200.229 f8:62:14:5a:9e:c7       (Unknown)
"""

found = re.findall(r"(\S+)\s+(\S+)\s+(.*)\n?", s)

print(found)
## prints:
## [('192.168.200.1', '90:ef:68:f8:8b:c2', 'ZyXEL Communications Corporation'), ('192.168.200.81', '60:45:cb:6c:5e:3e', '(Unknown)'), ('192.168.200.83', '0c:fe:45:4b:b8:98', 'Sony Interactive Entertainment Inc.'), ('192.168.200.106', 'ac:84:c6:57:f7:19', 'TP LINK'), ('192.168.200.72', '50:dc:e7:67:bd:e0', '(Unknown)'), ('192.168.200.157', '5c:52:1e:59:2c:d1', 'TP LINK'), ('192.168.200.229', 'f8:62:14:5a:9e:c7', '(Unknown)')]

Объяснение

pattern = (\S+)\s+(\S+)\s+(.*)\n?

В этом решении используется регулярное выражениенайти правильные строки.В этом случае: непробельные символы разделяются пробельными символами и, возможно, заканчиваются символом новой строки.

Findall возвращает результат в виде списка кортежей (поскольку мы указали несколько групп)

0 голосов
/ 24 февраля 2019

Общий случай

Как правило, split имеет ключевое слово maxsplit, где вы можете указать максимальное количество делений.Например,

>>> s = 'IP MAC Sony Interactive Entertainment'
>>> s.split(' ', maxsplit=2)
['IP', 'MAC', 'Sony Interactive Entertainment']

. Это разделит строку на количество раз, указанное вами в maxsplit, а остаток будет приведен к одной строке.


Из комментария

Выход - список, содержащий одну строку;где каждая строка из команды arp разделена новой строкой.

output = ['192.168.200.1\t90:ef:68:f8:8b:c2\tZyXEL Communications Corporation\n192.168.200.81\t60:45:cb:6c:5e:3e\t(Unknown)\n192.168.200.83\t0c:fe:45:4b:b8:98\tSony Interactive Entertainment Inc.\n192.168.200.83\t0c:fe:45:4b:b8:98\tSony Interactive Entertainment Inc. (DUP: 2)\n192.168.200.106\tac:84:c6:57:f7:19\t(Unknown)\n192.168.200.72\t50:dc:e7:67:bd:e0\t(Unknown)\n192.168.200.150\t5c:f9:38:d1:25:b5\tApple, Inc.\n192.168.200.150\t5c:f9:38:d1:25:b5\tApple, Inc. (DUP: 2)\n192.168.200.157\t5c:52:1e:59:2c:d1\t(Unknown)\n192.168.200.229\tf8:62:14:5a:9e:c7\t(Unknown)']

Разделить одну строку на list, содержащую каждую строку из команды arp в виде отдельной строки.

>>> item_list = output[0].split('\n')
>>> item_list
['192.168.200.1\t90:ef:68:f8:8b:c2\tZyXEL Communications Corporation',
 '192.168.200.81\t60:45:cb:6c:5e:3e\t(Unknown)',
 ....]

Теперь каждая строка просто \t разделена - поэтому нет необходимости в maxsplit.Возьмите первый элемент, например:

>>> item_one = item_list[0]
>>> item_one.split('\t')
['192.168.200.1', '90:ef:68:f8:8b:c2', 'ZyXEL Communications Corporation']

Имея это в виду, вы можете выполнить итерацию по полному item_list, чтобы создать список списков:

>>> output_list = list()
>>> for item in item_list:
...     output.append(item.split('\t'))
...
>>> output_list
[['192.168.200.1', '90:ef:68:f8:8b:c2', 'ZyXEL Communications Corporation'],
 ['192.168.200.81', '60:45:cb:6c:5e:3e', '(Unknown)'],
....]]

Втиснут в одну линию

>>> [item.split('\t') for item in output[0].split('\n')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...