2017-07-27 2 views
0

Je suis novice en python et pour stackoverflow, c'est mon premier article ici.Filtrage de plusieurs modèles de texte et stockage de ceux-ci et de leurs occurrences respectives

Je travaille avec un fichier journal qui ressemble à ceci:

1 février 00:00:02 noyau pont: ARRIVÉE TCP: IN = br0 phusin = 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 DTC = 6129 FENETRE = 16384 RES = 0x00 SYN URGP = 0

Je dois rechercher tout ce qui se trouve entre les deux-points. Dans cette ligne, le motif correspondant serait INBOUND TCP, mais il existe d'autres types de motifs.

Je dois rechercher ce champ, stocker tout type unique et combien de fois ils se sont produits dans le fichier.

Je sais déjà comment ouvrir le fichier et utiliser re.compile pour l'analyser et j'ai réussi à enregistrer les résultats uniques dans un autre fichier texte. Lire la documentation J'imagine que j'ai besoin d'utiliser un dictionnaire avec une sorte de boucle afin de stocker les différents modèles et leur numéro d'occurrence.

Quelqu'un peut-il m'aider?

Merci de nous lire si loin.

#!/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) 
+0

Nous ne sommes pas ici pour résoudre votre problème, mais pour vous aider dans votre démarche. Après, nous pouvons discuter d'optimisation. Cela étant dit, permet de voir votre code et ce que vous essayez et ce que vous obtenez, par opposition à ce que vous devez obtenir. – Fallenreaper

+0

Btw, '00' est également entre deux points. Quel regex envisagiez-vous d'utiliser? – randomir

+0

Je suis actuellement à la maison en ce moment et je n'ai pas accès à mon code en ce moment. Demain, je serai en mesure de poster ici, devrais-je modifier mon message et l'inclure ou devrais-je le poster ici dans les commentaires? Je vous remercie. – inu86

Répondre

0

tout d'abord vous ne devriez pas appeler votre dictionnaire dict car il est déjà un mot clé existant en python (The dict() constructor builds dictionaries directly from sequences of key-value pairs).

Cette ligne dict={"(f.line)", "(len(log))"} est incorrecte, les accolades utilisés comme cela signifie que vous définissez en fait une nouvelle set contenant deux chaînes, et non les variables que vous voulez - ils sont entre guillemets.

La déclaration du dictionnaire vide lui-même est correcte. Pour ajouter des valeurs à un dictionnaire existant, utilisez dictName[key] = value. Pour déclarer un dictionnaire avec des paires de valeurs, utilisez dictName = {key1 : value1, key2 : value2} etc.

+0

Merci pour les conseils. Je vais essayer dès que je le pourrai. – inu86

+0

J'ai apporté plusieurs modifications à mon code et je suis resté coincé dans une autre étape. Devrais-je soumettre une nouvelle question ou éditer ceci? Merci. – inu86