Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 11, 2017 11:18:50

Swell84
Зарегистрирован: 2017-01-31
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь

Ребят… Только начал заниматься Python.
Прошу помощи. Задача не сложная. Но пару вопросов имеется…

Так вот имеются log_i лог в txt, так вот открыть файл не проблема проверить нужные строки тоже не проблема. Но там на разных логах разные IP адреса. Так вот как из файла к примеру зная 2 строчки 100% одинаковые изъять из текстового файла и внести в новую переменную?

Вывод должен быть примерно такой

add adress = 1.1.1.1\24 вообщем целая строка целиком. Файл создан списком… По строкам…

Начал с этого для проверки, находит ли. Он нашёл. Всё круто но теперь нужно эту строчку вытащить в переменную из текстового файла…

 ip_conf = 'add address=1.1.0.1/24 interface=bridge1 network=1.1.1.0'
f = open('conf_.txt', 'r')
my_files = f.read()
if ip_conf in my_files:
    print("Тут есть эта надпись")
else:
    print('тут нету этих строк')



Офлайн

#2 Фев. 11, 2017 11:55:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Нужна помощь

не распарсил



Офлайн

#3 Фев. 11, 2017 13:49:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

Нужна помощь

FishHook
не распарсил
Можно модуль Шерлока Холмса подключить. Метод дедукции, который на самом деле метод дедукции + индукции + дедукции +индукции ….

Думаю, ему нужны регулярные выражения.

Как пришёл к этому выводу: ему нужно найти строку, но зачем её искать, если он уже её записал в переменную и её же и ищет? Значит, это не та строка, иначе зачем её извлекать, если она найдена ещё до поиска? Извлечение той же самой строки в саму себя? Навряд ли. Значит, ему нужно искать строку, у которой всё то же самое, но просто другой ip-адрес стоит, и извлекать из файла эту строку (если она там есть). А как можно подобрать такую же строку, но с любым другим ip-адресом? Конечно, через регулярное выражение, которое фиксирует неизменную часть строки и пропускает любой ip-адрес. Значит, ему нужны регулярные выражения.

Тут пример, как выбрать подходящие строки:
  
>> 
>>> text = """\
... abc
... abc
... localhost:1234
... def
... def
... localhost:5678
... ghi
... ghi
... """
>>> 
>>> pat = r':'
>>> 
>>> patc = re.compile(pat)
>>> 
>>> list(filter(patc.search, text.splitlines()))
['localhost:1234', 'localhost:5678']
>>>



Отредактировано py.user.next (Фев. 11, 2017 13:57:14)

Офлайн

#4 Фев. 11, 2017 17:33:46

Swell84
Зарегистрирован: 2017-01-31
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь

py.user.next

Верно, я прописал целую строчку записи в логах, но в логе есть и другие ip адреса. Внешние и внутренние, соответственно разные… Если писать как я написал пример… Тогда смысла в программе нет, и просто тупо можно руками всё разделить… Но там таких логов очень много…

А нужно чтобы из каждого лога… Автоматом программа отсеивала лишнее, оставляла именно эти строки с ip и эти записи в новый файл записывала…

Офлайн

#5 Фев. 11, 2017 19:25:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Нужна помощь

Swell84
А нужно чтобы из каждого лога…
Так приведите отрезок лога, покажите что хотите из него выделить. Напишите как хотели это сделать.



Офлайн

#6 Фев. 12, 2017 02:13:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

Нужна помощь

Swell84
Верно, я прописал целую строчку записи в логах, но в логе есть и другие ip адреса.
Надо входной файл приложить (короткую выдержку из лога).
Надо выходной файл приложить, в котором точный результат, полученный из входного файла после обработки.
И указать принцип поиска.



Офлайн

#7 Фев. 12, 2017 02:25:57

Swell84
Зарегистрирован: 2017-01-31
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь

py.user.next
doza_and

Вот пример лога

# feb/10/2017 12:00:02 by RouterOS 6.37.1
# software id = AVHU-21AV
#
/interface bridge
add mtu=1500 name=bridge1
/interface ethernet
set disabled=yes speed=100Mbps
/interface pptp-client
add connect-to=34.34.0.186 mrru=1600 name=GO user=4501
/interface wireless security-profiles
set supplicant-identity=MikroTik
add authentication-types=wpa2-psk eap-methods=“” management-protection=\
allowed mode=dynamic-keys name=profile1 supplicant-identity=“”
add authentication-types=wpa2-psk eap-methods=“” management-protection=\
allowed mode=dynamic-keys name=profile2 supplicant-identity=“”
/interface wireless
set band=2ghz-b/g/n disabled=no frequency=2442 \
max-station-count=20 mode=ap-bridge radio-name=MB_4501 rx-chains=0 \
security-profile=profile1 ssid=MB_4501 tx-chains=0 wireless-protocol=\
802.11
add default-forwarding=no disabled=no mac-address=02:0C:42:A6:1F:FF \
master-interface=wlan1 max-station-count=20 mode=ap-bridge name=wlan2 \
security-profile=profile2 ssid=MBR_Guest wds-cost-range=0 \
wds-default-cost=0
/interface wireless nstreme
set wlan1 enable-polling=no
/ip neighbor discovery
set wlan2 discover=no
/ip ipsec proposal
set enc-algorithms=3des
/ip pool
add name=LAN ranges=10.10.10.50-10.10.10.100
add name=Guest ranges=192.168.0.50-192.168.0.100
/ip dhcp-server
add address-pool=LAN disabled=no interface=bridge1 lease-time=3d name=dhcp1
add address-pool=Guest disabled=no interface=wlan2 lease-time=3d name=dhcp2
/queue simple
add max-limit=2M/2M name=Video target=10.10.10.2/32
/snmp community
set addresses=23.34.13.55/32
/system logging action
set 0 memory-lines=100
set 1 disk-lines-per-file=100
/interface bridge port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2
add bridge=bridge1 interface=ether5
add bridge=bridge1 interface=ether6
add bridge=bridge1 interface=ether7
add bridge=bridge1 interface=ether8
add bridge=bridge1 interface=ether9
add bridge=bridge1 interface=wlan1
add bridge=bridge1 interface=ether10
/interface bridge settings
set use-ip-firewall=yes
/ip address
add address=1.1.1.1/24 interface=bridge1 network=10.10.10.0
add address=55.34.56.123/24 interface=ether4 network=88.82.179.0
add address=192.168.0.1/24 interface=wlan2 network=192.168.0.0

Подчёркнутые строчки, нужно вытащить и закинуть отдельно в другой файл…
Вроде не сильно сложно, но таких логов с разными ip много. Нужно автоматизировать процесс.
После обработки должно выглядеть так. Только в другом txt файле не затрагивая этот…

add address=1.1.1.1/24 interface=bridge1 network=10.10.10.0
add address=55.34.56.123/24 interface=ether4 network=88.82.179.0
add address=192.168.0.1/24 interface=wlan2 network=192.168.0.0

Отредактировано Swell84 (Фев. 12, 2017 02:26:19)

Офлайн

#8 Фев. 12, 2017 07:41:40

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Нужна помощь

ну тут вроде как надо найти признаки которые отличают нужные строки от остальных. я увидел что после последнего вхождения символа = строка содержит 3 точки и только числа (если убрать точки) можно еще проверять что если строку разделить по точке то список будет содержать 4 элемента и все только числа(даже диапазон можно задать)
ну вобщем пока так как самый простой вариант

 def correckt(x):
    return True if x.count('.') == 3 and ''.join(x.split('.')).isdigit() else False
with open('log.txt') as inp:
    text = inp.read().split('\n')
for string  in text:
    sample = string [string.rfind('=')+1:]
    if correckt(sample):
        print (string)

 add address=1.1.1.1/24 interface=bridge1 network=10.10.10.0
add address=55.34.56.123/24 interface=ether4 network=88.82.179.0
add address=192.168.0.1/24 interface=wlan2 network=192.168.0.0

Отредактировано marvellik (Фев. 12, 2017 07:43:57)

Офлайн

#9 Фев. 12, 2017 08:52:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Нужна помощь

Мне кажется можно проще сделать

 for i in open("a.dat"):
    if i.startswith("add address="):
        print(i.strip())

Но вообще для фильтрации есть специальные утилиты и языки grep, awk, perl
 grep "add address=" a.dat >b.txt

b.txt:
 File a.dat:
add address=1.1.1.1/24 interface=bridge1 network=10.10.10.0
add address=55.34.56.123/24 interface=ether4 network=88.82.179.0
add address=192.168.0.1/24 interface=wlan2 network=192.168.0.0



Офлайн

#10 Фев. 12, 2017 08:58:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9993
Репутация: +  857  -
Профиль   Отправить e-mail  

Нужна помощь

doza_and
Но вообще для фильтрации есть специальные утилиты и языки grep
Тоже не понимаю, зачем питон здесь, если grep можно использовать. Если только дело в винде какой-нибудь, где питон проще поставить, чем grep.

doza_and
grep, awk, perl
А perl ему нафига? Вот sed стоило бы упомянуть.

Swell84
Вот пример лога
Надо было сделать архив с файлами и присоединить к сообщению. Иначе символы могут пропадать, так как движок форума их вырезает, так как считает ненужными для чтения. Можешь и теги code использовать, они как раз для точной передачи текста сделаны на всех форумах.

С тегами это вот так выглядит:
Вот так пишешь, и [квадратные скобки] и другие символы (вроде лишних пробелов - "                " ) сохраняются.

А без тегов это вот так выглядит:
Вот так пишешь, и и другие символы (вроде лишних пробелов - “ ” ) сохраняются.



Отредактировано py.user.next (Фев. 12, 2017 08:59:40)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version