Фильтрация нескольких текстовых шаблонов и сохранение их и соответствующих им вхождений

Я новичок в python и в самом stackoverflow, это мой первый пост здесь.

Я работаю с файлом журнала, который выглядит так:

1 февраля 00:00:02 ядро ​​моста: ВХОД TCP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=XXX.XXX.XXX.XXX DST=XXX.XXX.XXX.XXX LEN=40 TOS=0x00 PREC =0x00 TTL=110 ID=12973 PROTO=TCP SPT=220 DPT=6129 WINDOW=16384 RES=0x00 SYN URGP=0

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

Мне нужно найти это поле, сохранить все уникальные типы и сколько раз они встречались в файле.

Я уже знаю, как открыть файл и использовать re.compile для его анализа, и мне удалось сохранить уникальные результаты в другом текстовом файле.

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

Кто-нибудь может мне помочь?

Спасибо, если дочитали до этого места.

#!/usr/bin/python3
import sys
import os
import re

p= re.compile ('bridge kernel:.*:')
    with open (sys.argv[1], "r") as f:
        with open ('tipos.txt',"w" ) as f2:
            for line in f:
                if p.search(line):
                   f2.write(line.split(":")[3] + '\n')

os.system('sort tipos.txt|uniq > tipos2.txt')
dict={}
with open (sys.argv[1],"r") as log:
with open ('tipos2.txt','r') as f:
for l in f:
if f in log:
dict={"(f.line)", "(len(log))"}
    print (dict)

person inu86    schedule 27.07.2017    source источник
comment
мы здесь не для того, чтобы обязательно решить вашу проблему за вас, но помочь вам с вашим подходом. После этого мы можем обсудить оптимизацию. При этом давайте посмотрим ваш код и то, что вы пытаетесь сделать, и что вы получаете, а не то, что вам нужно получить.   -  person Fallenreaper    schedule 27.07.2017
comment
Кстати, 00 тоже между двоеточиями. Какое регулярное выражение вы планировали использовать?   -  person randomir    schedule 27.07.2017
comment
Сейчас я нахожусь дома, и в данный момент у меня нет доступа к моему коду. Завтра я смогу опубликовать это здесь, я должен отредактировать свой пост и включить его или я должен опубликовать его здесь, в комментариях? Спасибо.   -  person inu86    schedule 27.07.2017
comment
словари имеют метод get(key, default_value), вы можете установить значение по умолчанию 0 и добавлять 1 каждый раз, когда элемент появляется   -  person José Garcia    schedule 27.07.2017
comment
Всегда обновляйте вопрос, а не размещайте дополнительную информацию в комментариях.   -  person randomir    schedule 27.07.2017
comment
Я просто добавил свой код в сообщение. Спасибо за все советы и комментарии.   -  person inu86    schedule 27.07.2017
comment
пожалуйста, исправьте отступ вашего кода   -  person KGS    schedule 27.07.2017


Ответы (1)


Прежде всего, вы не должны называть свой словарь dict, поскольку он уже существующее ключевое слово в python (The dict() constructor builds dictionaries directly from sequences of key-value pairs).

Эта строка dict={"(f.line)", "(len(log))"} неверна, фигурные скобки, используемые таким образом, означают, что вы фактически определяете новый set содержащий две строки, а не нужные вам переменные - они в кавычках.

Объявление самого пустого словаря в порядке. Чтобы добавить значения в существующий словарь, используйте dictName[key] = value. Чтобы объявить словарь с парами значений, используйте dictName = {key1 : value1, key2 : value2} и т. д.

person KGS    schedule 27.07.2017
comment
Спасибо за советы. Я попробую, как только смогу. - person inu86; 27.07.2017
comment
Я внес несколько изменений в свой код и застрял на другом шаге. Должен ли я отправить новый вопрос или отредактировать этот? Спасибо. - person inu86; 02.08.2017