2017-04-12 2 views
0

J'essaie de voir combien de fois une chaîne se produit dans la colonne 4. Plus précisément combien de fois un numéro de port se produit dans certaines données Netflow. Il y a des milliers de ports donc je ne cherche rien d'autre que la récursivité. J'ai déjà analysé dans la colonne en utilisant les nombres après les deux points et je veux que le code vérifie combien de fois ce nombre se produit ainsi la sortie finale devrait imprimer le nombre avec combien de fois cela s'est produit commeCompte combien de fois une chaîne se produit dans une colonne spécifique

[SORTIE ]

Port: 80 found: 3 times. 
Port: 53 found: 2 times. 
Port: 21 found: 1 times. 

[CODE]

import re 


frequency = {} 

file = open('/Users/rojeliomaestas/Desktop/nettest2.txt', 'r') 

with open('/Users/rojeliomaestas/Desktop/nettest2.txt', 'r') as infile:  
    next(infile) 
    for line in infile: 
     data = line.split()[4].split(":")[1] 
     text_string = file.read().lower() 
     match_pattern = re.findall(data, text_string) 


for word in match_pattern: 
    count = frequency.get(word,0) 
    frequency[word] = count + 1 

frequency_list = frequency.keys() 

for words in frequency_list: 
    print ("port:", words,"found:", frequency[words], "times.") 

[DOSSIER]

Date first seen   Duration Proto  Src IP Addr:Port   Dst IP Addr:Port Packets Bytes Flows 
2017-04-02 12:07:32.079  9.298 UDP   8.8.8.8:80 ->  205.166.231.250:8080  1  345  1 
2017-04-02 12:08:32.079  9.298 TCP   8.8.8.8:53 ->  205.166.231.250:80  1  75  1 
2017-04-02 12:08:32.079  9.298 TCP   8.8.8.8:80 ->  205.166.231.250:69  1  875  1 
2017-04-02 12:08:32.079  9.298 TCP   8.8.8.8:53 ->  205.166.231.250:443  1  275  1 
2017-04-02 12:08:32.079  9.298 UDP   8.8.8.8:80 ->  205.166.231.250:23  1  842  1 
2017-04-02 12:08:32.079  9.298 TCP   8.8.8.8:21 ->  205.166.231.250:25  1  146  1 
+1

OK. Quelle est ta question? –

+0

Incidemment, pourquoi utilisez-vous 'file.read' * et *' pour line in infile'? Cela semble aboyer. –

+0

La boucle de sortie finale doit également être: 'pour port, comptez dans d.items(): print (" port: ", port," trouvé: ", count," times. ")' - utilisez 'iteritems' si vous sont bloqués sur Python 2.7. –

Répondre

0

Vous devez quelque chose comme:

frequency = {} 
with open('/Users/rojeliomaestas/Desktop/nettest2.txt', 'r') as infile:  
    next(infile) 
    for line in infile: 
     port = line.split()[4].split(":")[1] 
     frequency[port] = frequency.get(port,0) + 1 

for port, count in frequency.items(): 
    print("port:", port, "found:", count, "times.") 

Le cœur est que vous gardez un dict de port à compter, et incrémenter ce pour chaque ligne. dict.get retournera la valeur actuelle ou un défaut (dans ce cas 0).

+0

Cela a fonctionné, merci! – k5man001

+0

Comment pourrais-je trier cela du plus au moins? – k5man001

+0

C'est une question distincte - et presque certainement un doublon –

0

A partir de la bibliothèque standard python. Va retourner un dictionnaire avec exactement ce que vous cherchez.

from collections import Counter 
counts = Counter(column) 
counts.most_common(n) # will return the most common values for specified number (n) 
+1

Quelques explications supplémentaires seraient utiles ici. Je ne peux pas voir, actuellement, comment cela répond à la question (ce qui n'est pas vraiment une question non plus). – SiHa

+0

Oh mon Dieu, ma question est de savoir comment le code peut compter le nombre de fois qu'une chaîne se produit dans une colonne [4] sans avoir à spécifier quelle chaîne est la chaîne de caractères. – k5man001

+0

Il devrait comparer 1 ligne à toutes les autres lignes dans le fichier et continuer à le faire jusqu'à ce que chaque ligne est comparée et comptée si cela a du sens? – k5man001