Здравствуйте.
Начал сегодня изучать python, ранее лишь немного был знаком с php и чуть игрался с bash'ем.
Нужна помощь и совет в следующей задаче:
существует файл на 15000 строк вида:
TEST-MIB::testSnmpMode.asExternalLink.192.168.2.1.192.23.151.44 = Hex-STRING: 00 01 20 05 00 00 00 00 D9 17 97 2C 80 01 02 D5
D5 B4 00 24 FF 00 00 00 00 00 18 00 00 00 00
00 00 00 0A
TEST-MIB::testSnmpMode.asExternalLink.192.168.2.2.10.0.0.1 = Hex-STRING: 00 01 24 05 0A 0B 0A 00 D9 17 97 3E 80 00 07 73
05 BD 00 24 FF FF FF 00 00 00 00 14 00 00 00 00
00 00 00 00
TEST-MIB::testSnmpMode.asExternalLink.192.168.2.3.167.3.1.2 = Hex-STRING: 00 01 20 05 0A 0D 14 00 D9 17 97 3E 80 00 07 73
96 22 00 24 FF FF FF 00 00 00 00 15 00 00 00 00
00 00 00 00
Из этого файла (на примере трех блоков выше) необходимо получить данные вида:
192.168.2.1/FF000000 192.23.151.44
192.168.2.2/FFFFFF00 10.0.0.1
192.168.2.3/FFFFFF00 167.3.1.2
Иными словами, спарсить значения, которые находятся между "asExternalLink." до первого пробела, заменить четвертую точку знаком "/" и пробелом, потом распарсить следующую строку, вытащить из неё маску в шестнадцатеричном формате (потом её как-то надо будет в нормальный вид привести, но это уже другая история) и добавить её в уже форматированную первую строку после знака "/". Маска всегда идет после числа 24 и всегда на следующей строке после "...asExternalLink...".
Я написал на питоне:
#!/usr/bin/env python
import re
snmpwalkfile = open ("test2")
raw_list = snmpwalkfile.read()
raw_ip = re.findall ( 'asExternalLink.(.*?) ', raw_list, re.DOTALL) # Получаю из большого файла отпарсенные строки вида "192.168.2.1.192.23.151.44"
raw_mask = re.findall ('24\x20(..\x20..\x20..\x20..)', raw_list, re.DOTALL) # Получаю из большого файла регуляркой выражение после числа 24
for ip in raw_ip:
ip_list = re.findall ('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', ip, re.DOTALL) # Из файла строк 192.168.2.1.192.23.151.44 выделяю только первый IP-адрес
for ip_only in ip_list:
print ip_only
for mask in raw_mask:
print mask
snmpwalkfile.close()
Выводит на экран первый IP и маску в формате FF FF FF 00
Собственно, вопросов несколько:
1. В моменте, где я получаю значения после "24", возникает проблема, по регулярке '24\x20(..\x20..\x20..\x20..' можно найти ошибочные значения на первой строке (например, в исходном примере - "...Hex-STRING: 00 01 24 05 0A 0B 0A..."), что не нужно.
То есть либо перед тем как выполнить регулярку удалить строки, содержащие, например, "asExternalLink", а потом выполнить поиск значений, либо как-то указать, чтобы он парсил значения только в следующей строке после строки, содержащей "asExternalLink".
Разобраться не могу с этим вопросом.
2. Сложить два списка в коде выше - ip_only и mask, не смог разобраться, в какой for это прописать и как это в принципе лучше сделать.
3. Далее сделать третий список из "вторых IP-адресов", то есть в исходнике выше это 192.23.151.44, 10.0.0.1 и т.д. Здесь я, наверное, сам разберусь, интересует, как потом полученный список сложить со списком iponly+mask.
Я наверняка перемудрил и затупил с логикой, может, кто-нибудь подскажет, как это сделать проще в плане логики и, главное, в плане кода? Начал изучать язык сегодня, но, к сожалению, много чего ещё не постиг.
Благодарен за совет.